Cataclysm BN
game Class Reference

#include <game.h>

Classes

class  Creature_range
 
class  debug_hour_timer
 
class  draw_callback_t
 
class  monster_range
 
class  non_dead_range
 
class  npc_range
 

Public Member Functions

 game ()
 
 ~game ()
 
void load_static_data ()
 Loads static data that does not depend on mods or similar. More...
 
std::string get_player_base_save_path () const
 Base path for saving player data. More...
 
std::string get_world_base_save_path () const
 Base path for saving world data. More...
 
void on_options_changed ()
 Should be invoked whenever options change. More...
 
void setup ()
 
void serialize (std::ostream &fout)
 Saving and loading functions. More...
 
void unserialize (std::istream &fin)
 
void unserialize_master (std::istream &fin)
 
bool dump_stats (const std::string &what, dump_mode mode, const std::vector< std::string > &opts)
 write statistics to stdout and More...
 
bool save ()
 Returns false if saving failed. More...
 
std::vector< std::string > list_active_characters ()
 Returns a list of currently active character saves. More...
 
void write_memorial_file (const std::string &filename, std::string sLastWords)
 Writes information about the character out to a text file timestamped with the time of the file was made. More...
 
bool cleanup_at_end ()
 
void start_calendar ()
 
bool do_turn ()
 MAIN GAME LOOP. More...
 
shared_ptr_fast< ui_adaptorcreate_or_get_main_ui_adaptor ()
 
void invalidate_main_ui_adaptor () const
 
void mark_main_ui_adaptor_resize () const
 
void draw ()
 
void draw_ter (bool draw_sounds=true)
 
void draw_ter (const tripoint &center, bool looking=false, bool draw_sounds=true)
 
void add_draw_callback (shared_ptr_fast< draw_callback_t > cb)
 
void draw_panels (bool force_draw=false)
 
cata::optional< tripointget_veh_dir_indicator_location (bool next) const
 Returns the location where the indicator should go relative to the reality bubble, or nothing to indicate no indicator should be drawn. More...
 
void draw_veh_dir_indicator (bool next)
 
void vertical_move (int z, bool force, bool peeking=false)
 Moves the player vertically. More...
 
void start_hauling (const tripoint &pos)
 
cata::optional< tripointfind_or_make_stairs (map &mp, int z_after, bool &rope_ladder, bool peeking)
 Returns the other end of the stairs (if any). More...
 
void vertical_shift (int z_after)
 Actual z-level movement part of vertical_move. More...
 
void vertical_notes (int z_before, int z_after)
 Add goes up/down auto_notes (if turned on) More...
 
void use_computer (const tripoint &p)
 Checks to see if a player can use a computer (not illiterate, etc.) and uses if able. More...
 
template<typename T = Creature>
T * critter_by_id (const character_id &id)
 
template<typename T = Creature>
T * critter_at (const tripoint &p, bool allow_hallucination=false)
 Returns the Creature at the given location. More...
 
template<typename T = Creature>
const T * critter_at (const tripoint &p, bool allow_hallucination=false) const
 
template<typename T = Creature>
shared_ptr_fast< T > shared_from (const T &critter)
 Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature). More...
 
size_t num_creatures () const
 Returns the approximate number of creatures in the reality bubble. More...
 
bool update_zombie_pos (const monster &critter, const tripoint &pos)
 Redirects to the creature_tracker update_pos() function. More...
 
void remove_zombie (const monster &critter)
 
void clear_zombies ()
 Redirects to the creature_tracker clear() function. More...
 
bool spawn_hallucination (const tripoint &p)
 Spawns a hallucination at a determined position. More...
 
bool swap_critters (Creature &, Creature &)
 Swaps positions of two creatures. More...
 
Creature_range all_creatures ()
 Returns an anonymous range that contains all creatures. More...
 
monster_range all_monsters ()
 Same as all_creatures but iterators only over monsters. More...
 
npc_range all_npcs ()
 Same as all_creatures but iterators only over npcs. More...
 
std::vector< Creature * > get_creatures_if (const std::function< bool(const Creature &)> &pred)
 Returns all creatures matching a predicate. More...
 
std::vector< npc * > get_npcs_if (const std::function< bool(const npc &)> &pred)
 
Creatureget_creature_if (const std::function< bool(const Creature &)> &pred)
 Returns a creature matching a predicate. More...
 
bool is_empty (const tripoint &p)
 Returns true if there is no player, NPC, or monster on the tile and move_cost > 0. More...
 
bool is_in_sunlight (const tripoint &p)
 Returns true if p is outdoors and it is sunny. More...
 
bool is_sheltered (const tripoint &p)
 Returns true if p is indoors, underground, or in a car. More...
 
bool revive_corpse (const tripoint &p, item &it)
 Revives a corpse at given location. More...
 
void save_cyborg (item *cyborg, const tripoint &couch_pos, player &installer)
 Turns Broken Cyborg monster into Cyborg NPC via surgery. More...
 
bool cancel_activity_query (const std::string &text)
 Asks if the player wants to cancel their activity, and if so cancels it. More...
 
bool cancel_activity_or_ignore_query (distraction_type type, const std::string &text)
 Asks if the player wants to cancel their activity and if so cancels it. More...
 
void moving_vehicle_dismount (const tripoint &dest_loc)
 Handles players exiting from moving vehicles. More...
 
vehicleremoteveh ()
 Returns the current remotely controlled vehicle. More...
 
void setremoteveh (vehicle *veh)
 Sets the current remotely controlled vehicle. More...
 
int assign_mission_id ()
 Returns the next available mission id. More...
 
npcfind_npc (character_id id)
 Find the npc with the given ID. More...
 
void load_npcs ()
 Makes any nearby NPCs on the overmap active. More...
 
void reload_npcs ()
 Unloads, then loads the NPCs. More...
 
const kill_trackerget_kill_tracker () const
 
void add_npc_follower (const character_id &id)
 Add follower id to set of followers. More...
 
void remove_npc_follower (const character_id &id)
 Remove follower id from follower set. More...
 
std::set< character_idget_follower_list ()
 Get set of followers. More...
 
void validate_npc_followers ()
 validate list of followers to account for overmap buffers More...
 
void validate_mounted_npcs ()
 
void validate_linked_vehicles ()
 validate towed vehicles so they get linked up again after a load More...
 
void validate_camps ()
 validate camps to ensure they are on the overmap list More...
 
void autopilot_vehicles ()
 process vehicles that are following the player More...
 
void catch_a_monster (monster *fish, const tripoint &pos, player *p, const time_duration &catch_duration)
 Picks and spawns a random fish from the remaining fish list when a fish is caught. More...
 
std::unordered_set< tripointget_fishable_locations (int distance, const tripoint &fish_pos)
 Get the contiguous fishable locations starting at fish_pos, out to the specificed distance. More...
 
std::vector< monster * > get_fishable_monsters (std::unordered_set< tripoint > &fishable_locations)
 Get the fishable monsters within the provided fishable locations. More...
 
void fling_creature (Creature *c, const units::angle &dir, float flvel, bool controlled=false, bool suppress_map_update=false)
 Flings the input creature in the given direction. More...
 
float natural_light_level (int zlev) const
 
unsigned char light_level (int zlev) const
 Returns coarse number-of-squares of visibility at the current light level. More...
 
void reset_light_level ()
 
character_id assign_npc_id ()
 
Creatureis_hostile_nearby ()
 
Creatureis_hostile_very_close ()
 
point update_map (player &p)
 
point update_map (int &x, int &y)
 
void update_overmap_seen ()
 
void process_artifact (item &it, player &p)
 
void add_artifact_messages (const std::vector< art_effect_passive > &effects)
 
void add_artifact_dreams ()
 
void peek ()
 
void peek (const tripoint &p)
 
cata::optional< tripointlook_debug ()
 
bool check_zone (const zone_type_id &type, const tripoint &where) const
 
bool check_near_zone (const zone_type_id &type, const tripoint &where) const
 Checks whether or not there is a zone of particular type nearby. More...
 
bool is_zones_manager_open () const
 
void zones_manager ()
 
cata::optional< tripointlook_around (bool force_3d=false)
 
look_around_result look_around (bool show_window, tripoint &center, const tripoint &start_point, bool has_first_point, bool select_zone, bool peeking, bool is_moving_zone=false, const tripoint &end_point=tripoint_zero, bool force_3d=false)
 
void pre_print_all_tile_info (const tripoint &lp, const catacurses::window &w_info, int &line, int last_line, const visibility_variables &cache)
 
void print_all_tile_info (const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line, int last_line, const visibility_variables &cache)
 
void draw_look_around_cursor (const tripoint &lp, const visibility_variables &cache)
 
void extended_description (const tripoint &p)
 Long description of (visible) things at tile. More...
 
void draw_trail_to_square (const tripoint &t, bool bDrawX)
 
item_location inv_map_splice (item_filter filter, const std::string &title, int radius=0, const std::string &none_message="")
 Custom-filtered menu for inventory and nearby items and those that within specified radius. More...
 
bool has_gametype () const
 
special_game_id gametype () const
 
void toggle_fullscreen ()
 
void toggle_pixel_minimap ()
 
void reload_tileset (std::function< void(std::string)> out)
 
void temp_exit_fullscreen ()
 
void reenter_fullscreen ()
 
void zoom_in ()
 
void zoom_out ()
 
void reset_zoom ()
 
void set_zoom (int level)
 
int get_zoom () const
 
int get_moves_since_last_save () const
 
int get_user_action_counter () const
 
bool take_screenshot (const std::string &file_path) const
 Saves a screenshot of the current viewport, as a PNG file, to the given location. More...
 
bool take_screenshot () const
 Saves a screenshot of the current viewport, as a PNG file. More...
 
int get_levx () const
 The top left corner of the reality bubble (in submaps coordinates). More...
 
int get_levy () const
 
int get_levz () const
 
void load_map (const tripoint &pos_sm, bool pump_events=false)
 Load the main map at given location, see map::load, in global, absolute submap coordinates. More...
 
void load_map (const tripoint_abs_sm &pos_sm, bool pump_events=false)
 
overmapget_cur_om () const
 The overmap which contains the center submap of the reality bubble. More...
 
std::vector< npc * > allies ()
 Get all living player allies. More...
 
void set_driving_view_offset (const point &p)
 
void calc_driving_offset (vehicle *veh=nullptr)
 
void toggle_gate (const tripoint &p)
 
void knockback (const tripoint &s, const tripoint &t, int force, int stun, int dam_mult, Creature *source)
 
void knockback (std::vector< tripoint > &traj, int stun, int dam_mult, Creature *source)
 
void draw_bullet (const tripoint &t, int i, const std::vector< tripoint > &trajectory, char bullet)
 
void draw_hit_mon (const tripoint &p, const monster &m, bool dead=false)
 
void draw_hit_player (const Character &p, int dam)
 
void draw_line (const tripoint &p, const tripoint &center_point, const std::vector< tripoint > &points, bool noreveal=false)
 
void draw_line (const tripoint &p, const std::vector< tripoint > &points)
 
void draw_weather (const weather_printable &wPrint)
 
void draw_sct ()
 
void draw_zones (const tripoint &start, const tripoint &end, const tripoint &offset)
 
void draw_critter (const Creature &critter, const tripoint &center)
 
void draw_critter_highlighted (const Creature &critter, const tripoint &center)
 
void draw_cursor (const tripoint &p)
 
void draw_highlight (const tripoint &p)
 
void draw_radiation_override (const tripoint &p, int rad)
 
void draw_terrain_override (const tripoint &p, const ter_id &id)
 
void draw_furniture_override (const tripoint &p, const furn_id &id)
 
void draw_graffiti_override (const tripoint &p, bool has)
 
void draw_trap_override (const tripoint &p, const trap_id &id)
 
void draw_field_override (const tripoint &p, const field_type_id &id)
 
void draw_item_override (const tripoint &p, const itype_id &id, const mtype_id &mid, bool hilite)
 
void draw_vpart_override (const tripoint &p, const vpart_id &id, int part_mod, units::angle veh_dir, bool hilite, const point &mount)
 
void draw_below_override (const tripoint &p, bool draw)
 
void draw_monster_override (const tripoint &p, const mtype_id &id, int count, bool more, Creature::Attitude att)
 
bool is_in_viewport (const tripoint &p, int margin=0) const
 
bool check_safe_mode_allowed (bool repeat_safe_mode_warnings=true)
 Check whether movement is allowed according to safe mode settings. More...
 
void set_safe_mode (safe_mode_type mode)
 
void exam_vehicle (vehicle &veh, const point &cp=point_zero)
 open vehicle interaction screen More...
 
bool forced_door_closing (const tripoint &p, const ter_id &door_type, int bash_dmg)
 
bool load (const std::string &world)
 Attempt to load first valid save (if any) in world. More...
 
bool npc_menu (npc &who)
 Returns true if the menu handled stuff and player shouldn't do anything else. More...
 
bool phasing_move (const tripoint &dest, bool via_ramp=false)
 
bool walk_move (const tripoint &dest, bool via_ramp=false)
 
void on_move_effects ()
 
point place_player (const tripoint &dest)
 
void place_player_overmap (const tripoint_abs_omt &om_dest)
 
unsigned int get_seed () const
 
void set_npcs_dirty ()
 If invoked, NPCs will be reloaded before next turn. More...
 
void set_critter_died ()
 If invoked, dead will be cleaned this turn. More...
 
void mon_info (const catacurses::window &, int hor_padding=0)
 
void mon_info_update ()
 
void cleanup_dead ()
 
bool is_dangerous_tile (const tripoint &dest_loc) const
 
std::vector< std::string > get_dangerous_tile (const tripoint &dest_loc) const
 
bool prompt_dangerous_tile (const tripoint &dest_loc) const
 
void despawn_monster (monster &critter)
 Despawn a specific monster, it's stored on the overmap. More...
 
void win ()
 Marks the game as won. More...
 
bool disable_robot (const tripoint &p)
 If there is a robot (that can be disabled), query the player and try to disable it. More...
 
void draw_pixel_minimap (const catacurses::window &w)
 
void quicksave ()
 
void disp_NPCs ()
 
void list_missions ()
 
event_busevents ()
 
stats_trackerstats ()
 
memorial_loggermemorial ()
 
spell_eventsspell_events_subscriber ()
 
void display_toggle_overlay (action_id)
 
bool display_overlay_state (action_id)
 
void toggle_debug_hour_timer ()
 
tripoint mouse_edge_scrolling_terrain (input_context &ctxt)
 Used to implement mouse "edge scrolling". More...
 
tripoint mouse_edge_scrolling_overmap (input_context &ctxt)
 This variant is suitable for the overmap. More...
 
void shift_destination_preview (const point &delta)
 
bool slip_down ()
 Checks if player is able to successfully climb to/from some terrain and not slip down. More...
 
monsterplace_critter_at (const mtype_id &id, const tripoint &p)
 Adds critters to the reality bubble, creating them if necessary. More...
 
monsterplace_critter_at (const shared_ptr_fast< monster > &mon, const tripoint &p)
 
monsterplace_critter_around (const mtype_id &id, const tripoint &center, int radius)
 
monsterplace_critter_around (const shared_ptr_fast< monster > &mon, const tripoint &center, int radius, bool forced=false)
 
monsterplace_critter_within (const mtype_id &id, const tripoint_range< tripoint > &range)
 
monsterplace_critter_within (const shared_ptr_fast< monster > &mon, const tripoint_range< tripoint > &range)
 

Public Attributes

mapm
 
avataru
 
scent_mapscent
 
timed_event_managertimed_events
 
pimpl< Creature_trackercritter_tracker
 
pimpl< faction_managerfaction_manager_ptr
 
pimpl< drop_token_providertoken_provider_ptr
 
quit_status uquit
 Used in main.cpp to determine what type of quit is being performed. More...
 
bool new_game = false
 True if the game has just started or loaded, else false. More...
 
const scenarioscen
 
std::vector< monstercoming_to_stairs
 
int monstairz = 0
 
tripoint ter_view_p
 
catacurses::window w_terrain
 
catacurses::window w_overmap
 
catacurses::window w_omlegend
 
catacurses::window w_minimap
 
catacurses::window w_pixel_minimap
 
point driving_view_offset
 
bool debug_pathfinding = false
 
bool debug_submap_grid_overlay = false
 
Creaturedisplaying_visibility_creature
 Creature for which to display the visibility map. More...
 
int displaying_lighting_condition = 0
 Type of lighting condition overlay to display. More...
 
bool show_panel_adm = false
 
bool right_sidebar = false
 
bool fullscreen = false
 
bool was_fullscreen = false
 
bool auto_travel_mode = false
 
bool queue_screenshot = false
 
safe_mode_type safe_mode
 
int turnssincelastmon = 0
 
int mostseen = 0
 

Private Types

enum class  vmenu_ret : int { CHANGE_TAB , QUIT , FIRE }
 

Private Member Functions

void unload_npcs ()
 Unloads all NPCs. More...
 
bool load (const save_t &name)
 
void load_master ()
 
bool start_game ()
 
bool save_factions_missions_npcs ()
 
void reset_npc_dispositions ()
 
void serialize_master (std::ostream &fout)
 
bool save_artifacts ()
 
bool save_maps ()
 
void init_autosave ()
 
void create_starting_npcs ()
 
vehicleplace_vehicle_nearby (const vproto_id &id, const point_abs_omt &origin, int min_distance, int max_distance, const std::vector< std::string > &omt_search_types={})
 
void list_items_monsters ()
 
game::vmenu_ret list_items (const std::vector< map_item_stack > &item_list)
 
std::vector< map_item_stackfind_nearby_items (int iRadius)
 
void reset_item_list_state (const catacurses::window &window, int height, bool bRadiusSort)
 
game::vmenu_ret list_monsters (const std::vector< Creature * > &monster_list)
 
bool grabbed_move (const tripoint &dp)
 Check for dangerous stuff at dest_loc, return false if the player decides not to step there. More...
 
bool grabbed_veh_move (const tripoint &dp)
 
bool grabbed_furn_move (const tripoint &dp)
 
void control_vehicle ()
 
void examine (const tripoint &p)
 
void examine ()
 
void pickup ()
 
void pickup (const tripoint &p)
 
void pickup_feet ()
 
void drop ()
 
void drop_in_direction ()
 
void butcher ()
 
void chat ()
 
void print_fields_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line)
 
void print_terrain_info (const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line)
 
void print_trap_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line)
 
void print_creature_info (const Creature *creature, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_vehicle_info (const vehicle *veh, int veh_part, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_visibility_info (const catacurses::window &w_look, int column, int &line, visibility_type visibility)
 
void print_items_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
 
void print_graffiti_info (const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
 
input_context get_player_input (std::string &action)
 
void replace_stair_monsters ()
 
void update_stair_monsters ()
 
void shift_monsters (const tripoint &shift)
 Shift all active monsters, the shift vector is the number of shifted submaps. More...
 
void perhaps_add_random_npc ()
 
void monmove ()
 
void overmap_npc_move ()
 
void process_voluntary_act_interrupt ()
 
void process_activity ()
 
void handle_key_blocking_activity ()
 
void open_consume_item_menu ()
 
bool handle_action ()
 
bool try_get_right_click_action (action_id &act, const tripoint &mouse_target)
 
bool try_get_left_click_action (action_id &act, const tripoint &mouse_target)
 
void item_action_menu ()
 
bool is_game_over ()
 
void death_screen ()
 
void win_screen ()
 
void draw_minimap ()
 
void autosave ()
 
void quickload ()
 
bool handle_mouseview (input_context &ctxt, std::string &action)
 
void display_faction_epilogues ()
 
void disp_NPC_epilogues ()
 
void display_scent ()
 
void display_temperature ()
 
void display_vehicle_ai ()
 
void display_visibility ()
 
void display_lighting ()
 
void display_radiation ()
 
void display_transparency ()
 
Creatureis_hostile_within (int distance)
 
void move_save_to_graveyard (const std::string &dirname)
 
bool save_player_data ()
 
std::pair< tripoint, tripointmouse_edge_scrolling (input_context &ctxt, int speed, const tripoint &last, bool iso)
 

Private Attributes

bool is_looking = false
 
std::vector< weak_ptr_fast< draw_callback_t > > draw_callbacks
 
cata::optional< action_iddisplaying_overlays
 
class game::debug_hour_timer debug_hour_timer
 
pimpl< mapmap_ptr
 
pimpl< avataru_ptr
 
pimpl< live_viewliveview_ptr
 
live_viewliveview
 
pimpl< scent_mapscent_ptr
 
pimpl< timed_event_managertimed_event_manager_ptr
 
pimpl< event_busevent_bus_ptr
 
pimpl< stats_trackerstats_tracker_ptr
 
pimpl< achievements_trackerachievements_tracker_ptr
 
pimpl< kill_trackerkill_tracker_ptr
 
pimpl< memorial_loggermemorial_logger_ptr
 
pimpl< spell_eventsspell_events_ptr
 
pimpl< distribution_grid_trackergrid_tracker_ptr
 
pimpl< weather_managerweather_manager_ptr
 
shared_ptr_fast< playeru_shared_ptr
 
catacurses::window w_terrain_ptr
 
catacurses::window w_minimap_ptr
 
std::string sFilter
 
std::string list_item_upvote
 
std::string list_item_downvote
 
bool safe_mode_warning_logged = false
 
bool bVMonsterLookFire = false
 
character_id next_npc_id
 
std::list< shared_ptr_fast< npc > > active_npc
 
int next_mission_id = 0
 
std::set< character_idfollower_ids
 
int moves_since_last_save = 0
 
time_t last_save_timestamp
 
std::array< float, OVERMAP_LAYERSlatest_lightlevels
 
time_point remoteveh_cache_time
 
vehicleremoteveh_cache
 
bool npcs_dirty = false
 Has a NPC been spawned since last load? More...
 
bool critter_died = false
 Has anything died in this turn and needs to be cleaned up? More...
 
bool first_redraw_since_waiting_started = true
 Is this the first redraw since waiting (sleeping or activity) started. More...
 
bool zones_manager_open = false
 Is Zone manager open or not - changes graphics of some zone tiles. More...
 
std::unique_ptr< special_gamegamemode
 
int user_action_counter = 0
 
int tileset_zoom = 0
 How far the tileset should be zoomed out, 16 is default. More...
 
unsigned int seed = 0
 Seed for all the random numbers that should have consistent randomness (weather). More...
 
std::vector< tripointdestination_preview
 
std::chrono::time_point< std::chrono::steady_clock > last_mouse_edge_scroll
 
tripoint last_mouse_edge_scroll_vector_terrain
 
tripoint last_mouse_edge_scroll_vector_overmap
 
weak_ptr_fast< ui_adaptormain_ui_adaptor
 
std::unique_ptr< static_popupwait_popup
 

Friends

class editmap
 
class advanced_inventory
 
class main_menu
 
class monster_range
 
class Creature_range
 
distribution_grid_trackerget_distribution_grid_tracker ()
 Returns distribution grid tracker that is a part of the global game *g. More...
 
mapget_map ()
 
Characterget_player_character ()
 
avatarget_avatar ()
 
weather_managerget_weather ()
 

Detailed Description

Definition at line 143 of file game.h.

Member Enumeration Documentation

◆ vmenu_ret

enum class game::vmenu_ret : int
strongprivate
Enumerator
CHANGE_TAB 
QUIT 
FIRE 

Definition at line 769 of file game.h.

769 : int {
770 CHANGE_TAB,
771 QUIT,
772 FIRE, // Who knew, apparently you can do that in list_monsters
773 };

Constructor & Destructor Documentation

◆ game()

game::game ( )

Definition at line 298 of file game.cpp.

298 :
300 scent_ptr( *this ),
303 m( *map_ptr ),
304 u( *u_ptr ),
305 scent( *scent_ptr ),
307 uquit( QUIT_NO ),
308 new_game( false ),
310 mostseen( 0 ),
313 next_npc_id( 1 ),
314 next_mission_id( 1 ),
318 seed( 0 ),
319 last_mouse_edge_scroll( std::chrono::steady_clock::now() )
320{
328 world_generator = std::make_unique<worldfactory>();
329 // do nothing, everything that was in here is moved to init_data() which is called immediately after g = new game; in main.cpp
330 // The reason for this move is so that g is not uninitialized when it gets to installing the parts into vehicles.
331}
void subscribe(event_subscriber *)
Definition: event_bus.cpp:39
int mostseen
Definition: game.h:1023
pimpl< spell_events > spell_events_ptr
Definition: game.h:958
safe_mode_type safe_mode
Definition: game.h:1020
bool safe_mode_warning_logged
Definition: game.h:1034
pimpl< timed_event_manager > timed_event_manager_ptr
Definition: game.h:952
std::chrono::time_point< std::chrono::steady_clock > last_mouse_edge_scroll
Definition: game.h:1068
quit_status uquit
Used in main.cpp to determine what type of quit is being performed.
Definition: game.h:978
event_bus & events()
Definition: game.cpp:2702
pimpl< stats_tracker > stats_tracker_ptr
Definition: game.h:954
character_id next_npc_id
Definition: game.h:1036
pimpl< kill_tracker > kill_tracker_ptr
Definition: game.h:956
void reset_light_level()
Definition: game.cpp:3546
pimpl< memorial_logger > memorial_logger_ptr
Definition: game.h:957
shared_ptr_fast< player > u_shared_ptr
Definition: game.h:1025
pimpl< map > map_ptr
Definition: game.h:947
bool first_redraw_since_waiting_started
Is this the first redraw since waiting (sleeping or activity) started.
Definition: game.h:1051
pimpl< live_view > liveview_ptr
Definition: game.h:949
pimpl< achievements_tracker > achievements_tracker_ptr
Definition: game.h:955
pimpl< scent_map > scent_ptr
Definition: game.h:951
timed_event_manager & timed_events
Definition: game.h:966
unsigned int seed
Seed for all the random numbers that should have consistent randomness (weather).
Definition: game.h:1063
int next_mission_id
Definition: game.h:1038
bool new_game
True if the game has just started or loaded, else false.
Definition: game.h:980
pimpl< distribution_grid_tracker > grid_tracker_ptr
Definition: game.h:959
map & m
Definition: game.h:963
avatar & u
Definition: game.h:964
scent_map & scent
Definition: game.h:965
int user_action_counter
Definition: game.h:1057
live_view & liveview
Definition: game.h:950
int tileset_zoom
How far the tileset should be zoomed out, 16 is default.
Definition: game.h:1060
pimpl< avatar > u_ptr
Definition: game.h:948
time_point remoteveh_cache_time
Definition: game.h:1044
static void achievement_attained(const achievement *a)
Definition: game.cpp:291
static constexpr int DEFAULT_TILESET_ZOOM
Definition: game.h:41
@ SAFE_MODE_ON
Definition: game.h:78
@ QUIT_NO
Definition: game.h:68
mapbuffer MAPBUFFER
Definition: mapbuffer.cpp:40
const time_point before_time_starts
A time point that is always before the current turn, even when the game has just started.
Definition: calendar.cpp:25
For use with smart pointers when you don't actually want the deleter to do anything.
Definition: cata_utility.h:28
std::unique_ptr< worldfactory > world_generator

References achievements_tracker_ptr, events(), first_redraw_since_waiting_started, kill_tracker_ptr, memorial_logger_ptr, reset_light_level(), spell_events_ptr, stats_tracker_ptr, event_bus::subscribe(), and world_generator.

◆ ~game()

game::~game ( )
default

Member Function Documentation

◆ add_artifact_dreams()

void game::add_artifact_dreams ( )

Definition at line 11786 of file game.cpp.

11787{
11788 //If player is sleeping, get a dream from a carried artifact
11789 //Don't need to check that player is sleeping here, that's done before calling
11790 std::vector<item *> art_items = u.items_with( []( const item & it ) -> bool {
11791 return it.is_artifact();
11792 } );
11793 std::vector<item *> valid_arts;
11794 std::vector<std::vector<std::string>>
11795 valid_dreams; // Tracking separately so we only need to check its req once
11796 //Pull the list of dreams
11797 add_msg( m_debug, "Checking %s carried artifacts", art_items.size() );
11798 for( auto &it : art_items ) {
11799 //Pick only the ones with an applicable dream
11801 if( art && art->charge_req != ACR_NULL &&
11802 ( it->ammo_remaining() < it->ammo_capacity() ||
11803 it->ammo_capacity() == 0 ) ) { //or max 0 in case of wacky mod shenanigans
11804 add_msg( m_debug, "Checking artifact %s", it->tname() );
11805 if( check_art_charge_req( *it ) ) {
11806 add_msg( m_debug, " Has freq %s,%s", art->dream_freq_met, art->dream_freq_unmet );
11807 if( art->dream_freq_met > 0 && x_in_y( art->dream_freq_met, 100 ) ) {
11808 add_msg( m_debug, "Adding met dream from %s", it->tname() );
11809 valid_arts.push_back( it );
11810 valid_dreams.push_back( art->dream_msg_met );
11811 }
11812 } else {
11813 add_msg( m_debug, " Has freq %s,%s", art->dream_freq_met, art->dream_freq_unmet );
11814 if( art->dream_freq_unmet > 0 && x_in_y( art->dream_freq_unmet, 100 ) ) {
11815 add_msg( m_debug, "Adding unmet dream from %s", it->tname() );
11816 valid_arts.push_back( it );
11817 valid_dreams.push_back( art->dream_msg_unmet );
11818 }
11819 }
11820 }
11821 }
11822 if( !valid_dreams.empty() ) {
11823 add_msg( m_debug, "Found %s valid artifact dreams", valid_dreams.size() );
11824 const int selected = rng( 0, valid_arts.size() - 1 );
11825 auto it = valid_arts[selected];
11826 auto msg = random_entry( valid_dreams[selected] );
11827 const std::string &dream = string_format( _( msg ), it->tname() );
11828 add_msg( dream );
11829 } else {
11830 add_msg( m_debug, "Didn't have any dreams, sorry" );
11831 }
11832}
units::quantity< V, B > rng(const units::quantity< V, B > &min, const units::quantity< V, B > &max)
Definition: artifact.cpp:32
@ ACR_NULL
Definition: artifact.h:79
bool x_in_y(const time_duration &a, const time_duration &b)
Definition: calendar.cpp:521
This class is essentially a copyable unique pointer.
Definition: value_ptr.h:19
Definition: item.h:211
int ammo_remaining() const
Quantity of ammunition currently loaded in tool, gun or auxiliary gunmod.
Definition: item.cpp:7387
bool is_artifact() const
Definition: item.cpp:6968
int ammo_capacity() const
Maximum quantity of ammunition loadable for tool, gun or auxiliary gunmod.
Definition: item.cpp:7414
std::string tname(unsigned int quantity=1, bool with_prefix=true, unsigned int truncate=0) const
Return the (translated) item name.
Definition: item.cpp:4546
const itype * type
Definition: item.h:2157
std::vector< item * > items_with(const std::function< bool(const item &)> &filter)
Returns all items (including those within a container) matching the filter.
Definition: visitable.cpp:324
@ m_debug
Definition: enums.h:271
bool check_art_charge_req(item &it)
Definition: game.cpp:11489
void add_msg(std::string msg)
Definition: messages.cpp:884
V random_entry(const C &container, D default_value)
Returns a random entry in the container.
Definition: rng.h:88
std::string string_format(std::string_view format, Args &&...args)
Simple wrapper over string_formatter::parse.
cata::value_ptr< islot_artifact > artifact
Definition: itype.h:866
#define _(msg)
Definition: translations.h:116

References _, ACR_NULL, add_msg(), item::ammo_capacity(), item::ammo_remaining(), itype::artifact, check_art_charge_req(), item::is_artifact(), visitable< T >::items_with(), m_debug, random_entry(), rng(), string_format(), item::tname(), item::type, u, and x_in_y().

Referenced by do_turn().

◆ add_artifact_messages()

void game::add_artifact_messages ( const std::vector< art_effect_passive > &  effects)

Definition at line 11608 of file game.cpp.

11609{
11610 int net_str = 0;
11611 int net_dex = 0;
11612 int net_per = 0;
11613 int net_int = 0;
11614 int net_speed = 0;
11615
11616 for( auto &i : effects ) {
11617 switch( i ) {
11618 case AEP_STR_UP:
11619 net_str += 4;
11620 break;
11621 case AEP_DEX_UP:
11622 net_dex += 4;
11623 break;
11624 case AEP_PER_UP:
11625 net_per += 4;
11626 break;
11627 case AEP_INT_UP:
11628 net_int += 4;
11629 break;
11630 case AEP_ALL_UP:
11631 net_str += 2;
11632 net_dex += 2;
11633 net_per += 2;
11634 net_int += 2;
11635 break;
11636 case AEP_STR_DOWN:
11637 net_str -= 3;
11638 break;
11639 case AEP_DEX_DOWN:
11640 net_dex -= 3;
11641 break;
11642 case AEP_PER_DOWN:
11643 net_per -= 3;
11644 break;
11645 case AEP_INT_DOWN:
11646 net_int -= 3;
11647 break;
11648 case AEP_ALL_DOWN:
11649 net_str -= 2;
11650 net_dex -= 2;
11651 net_per -= 2;
11652 net_int -= 2;
11653 break;
11654
11655 case AEP_SPEED_UP:
11656 net_speed += 20;
11657 break;
11658 case AEP_SPEED_DOWN:
11659 net_speed -= 20;
11660 break;
11661
11662 case AEP_PBLUE:
11663 break; // No message
11664
11665 case AEP_SNAKES:
11666 add_msg( m_warning, _( "Your skin feels slithery." ) );
11667 break;
11668
11669 case AEP_INVISIBLE:
11670 add_msg( m_good, _( "You fade into invisibility!" ) );
11671 break;
11672
11673 case AEP_CLAIRVOYANCE:
11675 add_msg( m_good, _( "You can see through walls!" ) );
11676 break;
11677
11679 add_msg( m_good, _( "You can see through everything!" ) );
11680 break;
11681
11682 case AEP_STEALTH:
11683 add_msg( m_good, _( "Your steps stop making noise." ) );
11684 break;
11685
11686 case AEP_GLOW:
11687 add_msg( _( "A glow of light forms around you." ) );
11688 break;
11689
11690 case AEP_PSYSHIELD:
11691 add_msg( m_good, _( "Your mental state feels protected." ) );
11692 break;
11693
11695 add_msg( m_good, _( "You feel insulated." ) );
11696 break;
11697
11698 case AEP_CARRY_MORE:
11699 add_msg( m_good, _( "Your back feels strengthened." ) );
11700 break;
11701
11702 case AEP_FUN:
11703 add_msg( m_good, _( "You feel a pleasant tingle." ) );
11704 break;
11705
11706 case AEP_HUNGER:
11707 add_msg( m_warning, _( "You feel hungry." ) );
11708 break;
11709
11710 case AEP_THIRST:
11711 add_msg( m_warning, _( "You feel thirsty." ) );
11712 break;
11713
11714 case AEP_EVIL:
11715 add_msg( m_warning, _( "You feel an evil presence…" ) );
11716 break;
11717
11718 case AEP_SCHIZO:
11719 add_msg( m_bad, _( "You feel a tickle of insanity." ) );
11720 break;
11721
11722 case AEP_RADIOACTIVE:
11723 add_msg( m_warning, _( "Your skin prickles with radiation." ) );
11724 break;
11725
11726 case AEP_MUTAGENIC:
11727 add_msg( m_bad, _( "You feel your genetic makeup degrading." ) );
11728 break;
11729
11730 case AEP_ATTENTION:
11731 add_msg( m_warning, _( "You feel an otherworldly attention upon you…" ) );
11732 break;
11733
11734 case AEP_FORCE_TELEPORT:
11735 add_msg( m_bad, _( "You feel a force pulling you inwards." ) );
11736 break;
11737
11738 case AEP_MOVEMENT_NOISE:
11739 add_msg( m_warning, _( "You hear a rattling noise coming from inside yourself." ) );
11740 break;
11741
11742 case AEP_BAD_WEATHER:
11743 add_msg( m_warning, _( "You feel storms coming." ) );
11744 break;
11745
11746 case AEP_SICK:
11747 add_msg( m_bad, _( "You feel unwell." ) );
11748 break;
11749
11750 case AEP_SMOKE:
11751 add_msg( m_warning, _( "A cloud of smoke appears." ) );
11752 break;
11753 default:
11754 //Suppress warnings
11755 break;
11756 }
11757 }
11758
11759 std::string stat_info;
11760 if( net_str != 0 ) {
11761 stat_info += string_format( _( "Str %s%d! " ),
11762 ( net_str > 0 ? "+" : "" ), net_str );
11763 }
11764 if( net_dex != 0 ) {
11765 stat_info += string_format( _( "Dex %s%d! " ),
11766 ( net_dex > 0 ? "+" : "" ), net_dex );
11767 }
11768 if( net_int != 0 ) {
11769 stat_info += string_format( _( "Int %s%d! " ),
11770 ( net_int > 0 ? "+" : "" ), net_int );
11771 }
11772 if( net_per != 0 ) {
11773 stat_info += string_format( _( "Per %s%d! " ),
11774 ( net_per > 0 ? "+" : "" ), net_per );
11775 }
11776
11777 if( !stat_info.empty() ) {
11778 add_msg( m_neutral, stat_info );
11779 }
11780
11781 if( net_speed != 0 ) {
11782 add_msg( m_info, _( "Speed %s%d!" ), ( net_speed > 0 ? "+" : "" ), net_speed );
11783 }
11784}
@ m_good
Definition: enums.h:260
@ m_neutral
Definition: enums.h:267
@ m_info
Definition: enums.h:265
@ m_bad
Definition: enums.h:261
@ m_warning
Definition: enums.h:264
@ AEP_GLOW
Definition: enums.h:115
@ AEP_MUTAGENIC
Definition: enums.h:130
@ AEP_ALL_UP
Definition: enums.h:106
@ AEP_INT_UP
Definition: enums.h:105
@ AEP_INT_DOWN
Definition: enums.h:135
@ AEP_PER_UP
Definition: enums.h:104
@ AEP_PSYSHIELD
Definition: enums.h:116
@ AEP_CLAIRVOYANCE_PLUS
Definition: enums.h:142
@ AEP_MOVEMENT_NOISE
Definition: enums.h:139
@ AEP_STEALTH
Definition: enums.h:113
@ AEP_CARRY_MORE
Definition: enums.h:118
@ AEP_THIRST
Definition: enums.h:125
@ AEP_SPEED_UP
Definition: enums.h:107
@ AEP_EVIL
Definition: enums.h:127
@ AEP_ALL_DOWN
Definition: enums.h:136
@ AEP_DEX_UP
Definition: enums.h:103
@ AEP_SCHIZO
Definition: enums.h:128
@ AEP_DEX_DOWN
Definition: enums.h:133
@ AEP_FUN
Definition: enums.h:120
@ AEP_PER_DOWN
Definition: enums.h:134
@ AEP_FORCE_TELEPORT
Definition: enums.h:138
@ AEP_ATTENTION
Definition: enums.h:131
@ AEP_RADIOACTIVE
Definition: enums.h:129
@ AEP_SUPER_CLAIRVOYANCE
Definition: enums.h:112
@ AEP_BAD_WEATHER
Definition: enums.h:140
@ AEP_SICK
Definition: enums.h:141
@ AEP_CLAIRVOYANCE
Definition: enums.h:111
@ AEP_INVISIBLE
Definition: enums.h:110
@ AEP_STR_UP
Definition: enums.h:102
@ AEP_STR_DOWN
Definition: enums.h:132
@ AEP_HUNGER
Definition: enums.h:124
@ AEP_RESIST_ELECTRICITY
Definition: enums.h:117
@ AEP_PBLUE
Definition: enums.h:108
@ AEP_SPEED_DOWN
Definition: enums.h:137
@ AEP_SNAKES
Definition: enums.h:109
@ AEP_SMOKE
Definition: enums.h:126

References _, add_msg(), AEP_ALL_DOWN, AEP_ALL_UP, AEP_ATTENTION, AEP_BAD_WEATHER, AEP_CARRY_MORE, AEP_CLAIRVOYANCE, AEP_CLAIRVOYANCE_PLUS, AEP_DEX_DOWN, AEP_DEX_UP, AEP_EVIL, AEP_FORCE_TELEPORT, AEP_FUN, AEP_GLOW, AEP_HUNGER, AEP_INT_DOWN, AEP_INT_UP, AEP_INVISIBLE, AEP_MOVEMENT_NOISE, AEP_MUTAGENIC, AEP_PBLUE, AEP_PER_DOWN, AEP_PER_UP, AEP_PSYSHIELD, AEP_RADIOACTIVE, AEP_RESIST_ELECTRICITY, AEP_SCHIZO, AEP_SICK, AEP_SMOKE, AEP_SNAKES, AEP_SPEED_DOWN, AEP_SPEED_UP, AEP_STEALTH, AEP_STR_DOWN, AEP_STR_UP, AEP_SUPER_CLAIRVOYANCE, AEP_THIRST, m_bad, m_good, m_info, m_neutral, m_warning, and string_format().

◆ add_draw_callback()

void game::add_draw_callback ( shared_ptr_fast< draw_callback_t cb)

Definition at line 2997 of file game.cpp.

2998{
2999 draw_callbacks.erase(
3000 std::remove_if( draw_callbacks.begin(), draw_callbacks.end(),
3001 []( const weak_ptr_fast<draw_callback_t> &cbw ) {
3002 return cbw.expired();
3003 } ),
3004 draw_callbacks.end()
3005 );
3006 draw_callbacks.emplace_back( cb );
3007 cb->added = true;
3009}
void invalidate_main_ui_adaptor() const
Definition: game.cpp:2962
std::vector< weak_ptr_fast< draw_callback_t > > draw_callbacks
Definition: game.h:225
std::weak_ptr< T > weak_ptr_fast
Definition: memory_fast.h:17

References draw_callbacks, and invalidate_main_ui_adaptor().

Referenced by get_player_input(), list_items(), list_monsters(), look_around(), pickup(), and zones_manager().

◆ add_npc_follower()

void game::add_npc_follower ( const character_id id)

Add follower id to set of followers.

Definition at line 1874 of file game.cpp.

1875{
1876 follower_ids.insert( id );
1877 u.follower_ids.insert( id );
1878}
std::set< character_id > follower_ids
Definition: game.h:1039
std::set< character_id > follower_ids
Definition: player.h:261

References follower_ids, player::follower_ids, and u.

Referenced by validate_npc_followers().

◆ all_creatures()

game::Creature_range game::all_creatures ( )

Returns an anonymous range that contains all creatures.

The range allows iteration via a range-based for loop, e.g. for( Creature &critter : all_creatures() ) { ... }. One shall not store the returned range nor the iterators. One can freely remove and add creatures to the game during the iteration. Added creatures will not be iterated over.

Definition at line 11944 of file game.cpp.

11945{
11946 return Creature_range( *this );
11947}
friend class Creature_range
Definition: game.h:334

References Creature_range.

Referenced by draw_ter(), get_creature_if(), and get_creatures_if().

◆ all_monsters()

game::monster_range game::all_monsters ( )

Same as all_creatures but iterators only over monsters.

Definition at line 11949 of file game.cpp.

11950{
11951 return monster_range( *this );
11952}
friend class monster_range
Definition: game.h:333

References monster_range.

Referenced by cleanup_at_end(), disp_NPCs(), get_fishable_monsters(), monmove(), place_player_overmap(), shift_monsters(), start_game(), validate_mounted_npcs(), and vertical_move().

◆ all_npcs()

game::npc_range game::all_npcs ( )

Same as all_creatures but iterators only over npcs.

Definition at line 11954 of file game.cpp.

11955{
11956 return npc_range( *this );
11957}

Referenced by do_turn(), and get_npcs_if().

◆ allies()

std::vector< npc * > game::allies ( )

Get all living player allies.

Definition at line 11858 of file game.cpp.

11859{
11860 return get_npcs_if( [&]( const npc & guy ) {
11861 if( !guy.is_hallucination() ) {
11862 return guy.is_ally( g->u );
11863 } else {
11864 return false;
11865 }
11866 } );
11867}
std::vector< npc * > get_npcs_if(const std::function< bool(const npc &)> &pred)
Definition: game.cpp:11881
Definition: npc.h:744
bool is_hallucination() const override
Definition: npc.cpp:3285

References get_npcs_if(), and npc::is_hallucination().

◆ assign_mission_id()

int game::assign_mission_id ( )

Returns the next available mission id.

Definition at line 1862 of file game.cpp.

1863{
1864 int ret = next_mission_id;
1866 return ret;
1867}

References next_mission_id, and cata::hash64_detail::ret.

◆ assign_npc_id()

character_id game::assign_npc_id ( )

Definition at line 3554 of file game.cpp.

3555{
3557 ++next_npc_id;
3558 return ret;
3559}

References next_npc_id, and cata::hash64_detail::ret.

Referenced by load(), and start_game().

◆ autopilot_vehicles()

void game::autopilot_vehicles ( )

process vehicles that are following the player

Definition at line 1661 of file game.cpp.

1662{
1663 for( wrapped_vehicle &veh : m.get_vehicles() ) {
1664 vehicle *&v = veh.v;
1665 if( v->is_following ) {
1666 v->drive_to_local_target( m.getabs( u.pos() ), true );
1667 } else if( v->is_patrolling ) {
1668 v->autopilot_patrol();
1669 }
1670 }
1671}
const tripoint & pos() const override
Definition: character.cpp:587
tripoint getabs(const tripoint &p) const
Translates local (to this map) coordinates of a square to global absolute coordinates.
Definition: map.cpp:8335
VehicleList get_vehicles()
Definition: map.cpp:295
A vehicle as a whole with all its components.
Definition: vehicle.h:676
void autopilot_patrol()
Definition: vehicle.cpp:702
bool is_following
Definition: vehicle.h:2008
bool is_patrolling
Definition: vehicle.h:2009
void drive_to_local_target(const tripoint &target, bool follow_protocol)
Definition: vehicle.cpp:817

References vehicle::autopilot_patrol(), vehicle::drive_to_local_target(), map::get_vehicles(), map::getabs(), vehicle::is_following, vehicle::is_patrolling, m, Character::pos(), and u.

Referenced by do_turn().

◆ autosave()

void game::autosave ( )
private

Definition at line 11275 of file game.cpp.

11276{
11277 //Don't autosave if the min-autosave interval has not passed since the last autosave/quicksave.
11278 if( time( nullptr ) < last_save_timestamp + 60 * get_option<int>( "AUTOSAVE_MINUTES" ) ) {
11279 return;
11280 }
11281 quicksave(); //Driving checks are handled by quicksave()
11282}
time_t last_save_timestamp
Definition: game.h:1041
void quicksave()
Definition: game.cpp:11230
@ time
Recharges slowly with time.

References last_save_timestamp, quicksave(), and time.

Referenced by do_turn().

◆ butcher()

void game::butcher ( )
private

Definition at line 8271 of file game.cpp.

8272{
8273 static const std::string salvage_string = "salvage";
8274 if( u.controlling_vehicle ) {
8275 add_msg( m_info, _( "You can't butcher while driving!" ) );
8276 return;
8277 }
8278
8279 const int factor = u.max_quality( quality_id( "BUTCHER" ) );
8280 const int factorD = u.max_quality( quality_id( "CUT_FINE" ) );
8281 const std::string no_knife_msg = _( "You don't have a butchering tool." );
8282 const std::string no_corpse_msg = _( "There are no corpses here to butcher." );
8283
8284 //You can't butcher on sealed terrain- you have to smash/shovel/etc it open first
8285 if( m.has_flag( "SEALED", u.pos() ) ) {
8286 if( m.sees_some_items( u.pos(), u ) ) {
8287 add_msg( m_info, _( "You can't access the items here." ) );
8288 } else if( factor > INT_MIN || factorD > INT_MIN ) {
8289 add_msg( m_info, no_corpse_msg );
8290 } else {
8291 add_msg( m_info, no_knife_msg );
8292 }
8293 return;
8294 }
8295
8296 const item *first_item_without_tools = nullptr;
8297 // Indices of relevant items
8298 std::vector<map_stack::iterator> corpses;
8299 std::vector<map_stack::iterator> disassembles;
8300 std::vector<map_stack::iterator> salvageables;
8301 map_stack items = m.i_at( u.pos() );
8302 const inventory &crafting_inv = u.crafting_inventory();
8303
8304 // TODO: Properly handle different material whitelists
8305 // TODO: Improve quality of this section
8306 auto salvage_filter = []( item it ) {
8307 const auto usable = it.get_usable_item( salvage_string );
8308 return usable != nullptr;
8309 };
8310
8311 std::vector< item * > salvage_tools = u.items_with( salvage_filter );
8312 int salvage_tool_index = INT_MIN;
8313 item *salvage_tool = nullptr;
8314 const salvage_actor *salvage_iuse = nullptr;
8315 if( !salvage_tools.empty() ) {
8316 salvage_tool = salvage_tools.front();
8317 salvage_tool_index = u.get_item_position( salvage_tool );
8318 item *usable = salvage_tool->get_usable_item( salvage_string );
8319 salvage_iuse = dynamic_cast<const salvage_actor *>(
8320 usable->get_use( salvage_string )->get_actor_ptr() );
8321 }
8322
8323 // Reserve capacity for each to hold entire item set if necessary to prevent
8324 // reallocations later on
8325 corpses.reserve( items.size() );
8326 salvageables.reserve( items.size() );
8327 disassembles.reserve( items.size() );
8328
8329 // Split into corpses, disassemble-able, and salvageable items
8330 // It's not much additional work to just generate a corpse list and
8331 // clear it later, but does make the splitting process nicer.
8332 for( map_stack::iterator it = items.begin(); it != items.end(); ++it ) {
8333 if( it->is_corpse() ) {
8334 corpses.push_back( it );
8335 } else {
8336 if( ( salvage_tool_index != INT_MIN ) && salvage_iuse->valid_to_cut_up( *it ) ) {
8337 salvageables.push_back( it );
8338 }
8339 if( crafting::can_disassemble( u, *it, crafting_inv ).success() ) {
8340 disassembles.push_back( it );
8341 } else if( !first_item_without_tools ) {
8342 first_item_without_tools = &*it;
8343 }
8344 }
8345 }
8346
8347 // Clear corpses if butcher and dissect factors are INT_MIN
8348 if( factor == INT_MIN && factorD == INT_MIN ) {
8349 corpses.clear();
8350 }
8351
8352 if( corpses.empty() && disassembles.empty() && salvageables.empty() ) {
8353 if( factor > INT_MIN || factorD > INT_MIN ) {
8354 add_msg( m_info, no_corpse_msg );
8355 } else {
8356 add_msg( m_info, no_knife_msg );
8357 }
8358
8359 if( first_item_without_tools ) {
8360 add_msg( m_info, _( "You don't have the necessary tools to disassemble any items here." ) );
8361 // Just for the "You need x to disassemble y" messages
8362 const auto ret = crafting::can_disassemble( u, *first_item_without_tools, crafting_inv );
8363 if( !ret.success() ) {
8364 add_msg( m_info, "%s", ret.c_str() );
8365 }
8366 }
8367 return;
8368 }
8369
8370 Creature *hostile_critter = is_hostile_very_close();
8371 if( hostile_critter != nullptr ) {
8372 if( !query_yn( _( "You see %s nearby! Start butchering anyway?" ),
8373 hostile_critter->disp_name() ) ) {
8374 return;
8375 }
8376 }
8377
8378 // Magic indices for special butcher options
8379 enum : int {
8380 MULTISALVAGE = MAX_ITEM_IN_SQUARE + 1,
8381 MULTIBUTCHER,
8382 MULTIDISASSEMBLE_ONE,
8383 MULTIDISASSEMBLE_ALL,
8384 NUM_BUTCHER_ACTIONS
8385 };
8386 // What are we butchering (i.e.. which vector to pick indices from)
8387 enum {
8388 BUTCHER_CORPSE,
8389 BUTCHER_DISASSEMBLE,
8390 BUTCHER_SALVAGE,
8391 BUTCHER_OTHER // For multisalvage etc.
8392 } butcher_select = BUTCHER_CORPSE;
8393 // Index to std::vector of iterators...
8394 int indexer_index = 0;
8395
8396 // Generate the indexed stacks so we can display them nicely
8397 const auto disassembly_stacks = generate_butcher_stack_display( disassembles );
8398 const auto salvage_stacks = generate_butcher_stack_display( salvageables );
8399 // Always ask before cutting up/disassembly, but not before butchery
8400 size_t ret = 0;
8401 if( !corpses.empty() || !disassembles.empty() || !salvageables.empty() ) {
8402 uilist kmenu;
8403 kmenu.text = _( "Choose corpse to butcher / item to disassemble" );
8404
8405 size_t i = 0;
8406 // Add corpses, disassembleables, and salvagables to the UI
8407 add_corpses( kmenu, corpses, i );
8408 add_disassemblables( kmenu, disassembly_stacks, i );
8409 if( salvage_iuse && !salvageables.empty() ) {
8410 add_salvagables( kmenu, salvage_stacks, i, *salvage_iuse );
8411 }
8412
8413 if( corpses.size() > 1 ) {
8414 kmenu.addentry( MULTIBUTCHER, true, 'b', _( "Butcher everything" ) );
8415 }
8416 if( disassembles.size() > 1 ) {
8417 int time_to_disassemble = 0;
8418 int time_to_disassemble_all = 0;
8419 for( const auto &stack : disassembly_stacks ) {
8420 const int time = recipe_dictionary::get_uncraft( stack.first->typeId() ).time;
8421 time_to_disassemble += time;
8422 time_to_disassemble_all += time * stack.second;
8423 }
8424
8425 kmenu.addentry_col( MULTIDISASSEMBLE_ONE, true, 'D', _( "Disassemble everything once" ),
8426 to_string_clipped( time_duration::from_turns( time_to_disassemble / 100 ) ) );
8427 kmenu.addentry_col( MULTIDISASSEMBLE_ALL, true, 'd', _( "Disassemble everything recursively" ),
8428 to_string_clipped( time_duration::from_turns( time_to_disassemble_all / 100 ) ) );
8429 }
8430 if( salvage_iuse && salvageables.size() > 1 ) {
8431 int time_to_salvage = 0;
8432 for( const auto &stack : salvage_stacks ) {
8433 time_to_salvage += salvage_iuse->time_to_cut_up( *stack.first ) * stack.second;
8434 }
8435
8436 kmenu.addentry_col( MULTISALVAGE, true, 'z', _( "Cut up everything" ),
8437 to_string_clipped( time_duration::from_turns( time_to_salvage / 100 ) ) );
8438 }
8439
8440 kmenu.query();
8441
8442 if( kmenu.ret < 0 || kmenu.ret >= NUM_BUTCHER_ACTIONS ) {
8443 return;
8444 }
8445
8446 ret = static_cast<size_t>( kmenu.ret );
8447 if( ret >= MULTISALVAGE && ret < NUM_BUTCHER_ACTIONS ) {
8448 butcher_select = BUTCHER_OTHER;
8449 indexer_index = ret;
8450 } else if( ret < corpses.size() ) {
8451 butcher_select = BUTCHER_CORPSE;
8452 indexer_index = ret;
8453 } else if( ret < corpses.size() + disassembly_stacks.size() ) {
8454 butcher_select = BUTCHER_DISASSEMBLE;
8455 indexer_index = ret - corpses.size();
8456 } else if( ret < corpses.size() + disassembly_stacks.size() + salvage_stacks.size() ) {
8457 butcher_select = BUTCHER_SALVAGE;
8458 indexer_index = ret - corpses.size() - disassembly_stacks.size();
8459 } else {
8460 debugmsg( "Invalid butchery index: %d", ret );
8461 return;
8462 }
8463 }
8464
8465 if( !u.has_morale_to_craft() ) {
8466 if( butcher_select == BUTCHER_CORPSE || indexer_index == MULTIBUTCHER ) {
8467 add_msg( m_info,
8468 _( "You are not in the mood and the prospect of guts and blood on your hands convinces you to turn away." ) );
8469 } else {
8470 add_msg( m_info,
8471 _( "You are not in the mood and the prospect of work stops you before you begin." ) );
8472 }
8473 return;
8474 }
8475 const auto helpers = character_funcs::get_crafting_helpers( u );
8476 for( const npc *np : helpers ) {
8477 add_msg( m_info, _( "%s helps with this task…" ), np->name );
8478 }
8479 switch( butcher_select ) {
8480 case BUTCHER_OTHER:
8481 switch( indexer_index ) {
8482 case MULTISALVAGE:
8483 u.assign_activity( activity_id( "ACT_LONGSALVAGE" ), 0, salvage_tool_index );
8484 break;
8485 case MULTIBUTCHER:
8486 butcher_submenu( corpses );
8487 for( map_stack::iterator &it : corpses ) {
8488 u.activity.targets.emplace_back( map_cursor( u.pos() ), &*it );
8489 }
8490 break;
8491 case MULTIDISASSEMBLE_ONE:
8492 crafting::disassemble_all( u, false );
8493 break;
8494 case MULTIDISASSEMBLE_ALL:
8496 break;
8497 default:
8498 debugmsg( "Invalid butchery type: %d", indexer_index );
8499 return;
8500 }
8501 break;
8502 case BUTCHER_CORPSE: {
8503 butcher_submenu( corpses, indexer_index );
8504 u.activity.targets.emplace_back( map_cursor( u.pos() ), &*corpses[indexer_index] );
8505 }
8506 break;
8507 case BUTCHER_DISASSEMBLE: {
8508 // Pick index of first item in the disassembly stack
8509 item *const target = &*disassembly_stacks[indexer_index].first;
8511 }
8512 break;
8513 case BUTCHER_SALVAGE: {
8514 if( !salvage_iuse || !salvage_tool ) {
8515 debugmsg( "null salve_iuse or salvage_tool" );
8516 } else {
8517 // Pick index of first item in the salvage stack
8518 item *const target = &*salvage_stacks[indexer_index].first;
8519 item_location item_loc( map_cursor( u.pos() ), target );
8520 salvage_iuse->cut_up( u, *salvage_tool, item_loc );
8521 }
8522 }
8523 break;
8524 }
8525}
string_id< activity_type > activity_id
Definition: activity_type.h:15
static std::string to_string_clipped(const int num, const clipped_unit type, const clipped_align align)
Definition: calendar.cpp:228
bool controlling_vehicle
Definition: character.h:246
player_activity activity
Definition: character.h:1541
int get_item_position(const item *it) const
Returns the item position (suitable for i_at or similar) of a specific item.
Definition: character.cpp:2325
bool has_morale_to_craft() const
Definition: crafting.cpp:336
const inventory & crafting_inventory(bool clear_path)
Definition: crafting.cpp:554
void assign_activity(const activity_id &type, int moves=calendar::INDEFINITELY_LONG, int index=-1, int pos=INT_MIN, const std::string &name="")
Legacy activity assignment, does not work for any activites using the new activity_actor class and ma...
Definition: character.cpp:9145
virtual std::string disp_name(bool possessive=false, bool capitalize_first=false) const =0
Creature * is_hostile_very_close()
Definition: game.cpp:3568
A lightweight handle to an item independent of it's location Unlike a raw pointer can be (de-)seriali...
Definition: item_location.h:23
size_t size() const
Definition: item_stack.cpp:10
iterator begin()
Definition: item_stack.cpp:28
iterator end()
Definition: item_stack.cpp:33
item * get_usable_item(const std::string &use_name)
Checks this item and its contents (recursively) for types that have use_function with type use_name.
Definition: item.cpp:7974
const use_function * get_use(const std::string &use_name) const
Returns the pointer to use_function with name use_name assigned to the type of this item or any of it...
Definition: item.cpp:7948
Definition: map.h:105
bool has_flag(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2351
map_stack i_at(const tripoint &p)
Definition: map.cpp:4149
bool sees_some_items(const tripoint &p, const Creature &who) const
Check if creature can see some items at p.
Definition: map.cpp:4795
std::vector< item_location > targets
static const recipe & get_uncraft(const itype_id &id)
Returns disassembly recipe (or null recipe if no match)
int time
Definition: recipe.h:61
Cuts stuff up into components.
Definition: iuse_actor.h:567
bool valid_to_cut_up(const item &it) const
int cut_up(player &p, item &it, item_location &cut) const
int time_to_cut_up(const item &it) const
static constexpr time_duration from_turns(const T t)
Named constructors to get a duration representing a multiple of the named time units.
Definition: calendar.h:204
uilist: scrolling vertical list menu
Definition: ui.h:187
int ret
Definition: ui.h:412
void addentry_col(int r, bool e, int k, const std::string &str, const std::string &column, const std::string &desc="")
Definition: ui.cpp:962
std::string text
Definition: ui.h:320
void addentry(const std::string &str)
Definition: ui.cpp:942
int max_quality(const quality_id &qual) const
Return maximum tool quality level provided by instance or INT_MIN if not found.
Definition: visitable.cpp:276
#define debugmsg(...)
Debug message of level DL::Error and class DC::DebugMsg, also includes the source file name and line,...
Definition: debug.h:74
static void butcher_submenu(const std::vector< map_stack::iterator > &corpses, int corpse=-1)
Definition: game.cpp:8121
static void add_salvagables(uilist &menu, const std::vector< std::pair< map_stack::iterator, int > > &stacks, size_t &menu_index, const salvage_actor &salvage_iuse)
Definition: game.cpp:8079
static void add_disassemblables(uilist &menu, const std::vector< std::pair< map_stack::iterator, int > > &stacks, size_t &menu_index)
Definition: game.cpp:8100
static std::vector< std::pair< map_stack::iterator, int > > generate_butcher_stack_display(const std::vector< map_stack::iterator > &its)
Definition: game.cpp:8032
static void add_corpses(uilist &menu, const std::vector< map_stack::iterator > &its, size_t &menu_index)
Definition: game.cpp:8067
static constexpr int MAX_ITEM_IN_SQUARE
void query(bool loop=true, int timeout=-1)
Handle input and update display.
Definition: ui.cpp:838
std::vector< npc * > get_crafting_helpers(const Character &who, int max)
Returns nearby NPCs ready and willing to help with crafting or some other manual task.
ret_val< bool > can_disassemble(const Character &who, const item &obj, const inventory &inv)
Check if character can disassemble an item using the given crafting inventory.
Definition: crafting.cpp:1877
bool disassemble(avatar &you)
Prompt for an item to disassemble, then start activity.
Definition: crafting.cpp:2061
bool disassemble_all(avatar &you, bool recursively)
Start an activity to disassemble all items in avatar's square.
Definition: crafting.cpp:2072
bool query_yn(const std::string &text)
Definition: output.cpp:698
iuse_actor * get_actor_ptr()
Definition: iuse.h:314
string_id< quality > quality_id
Definition: type_id.h:181

References _, Character::activity, add_corpses(), add_disassemblables(), add_msg(), add_salvagables(), uilist::addentry(), uilist::addentry_col(), Character::assign_activity(), item_stack::begin(), butcher_submenu(), crafting::can_disassemble(), Character::controlling_vehicle, Character::crafting_inventory(), salvage_actor::cut_up(), debugmsg, crafting::disassemble(), crafting::disassemble_all(), Creature::disp_name(), item_stack::end(), time_duration::from_turns(), generate_butcher_stack_display(), use_function::get_actor_ptr(), character_funcs::get_crafting_helpers(), Character::get_item_position(), recipe_dictionary::get_uncraft(), item::get_usable_item(), item::get_use(), map::has_flag(), Character::has_morale_to_craft(), map::i_at(), is_hostile_very_close(), visitable< T >::items_with(), m, m_info, MAX_ITEM_IN_SQUARE, visitable< T >::max_quality(), Character::pos(), uilist::query(), query_yn(), cata::hash64_detail::ret, uilist::ret, map::sees_some_items(), item_stack::size(), player_activity::targets, uilist::text, recipe::time, time, salvage_actor::time_to_cut_up(), to_string_clipped(), u, and salvage_actor::valid_to_cut_up().

Referenced by handle_action().

◆ calc_driving_offset()

void game::calc_driving_offset ( vehicle veh = nullptr)

Definition at line 1241 of file game.cpp.

1242{
1243 if( veh == nullptr || !get_option<bool>( "DRIVING_VIEW_OFFSET" ) ) {
1245 return;
1246 }
1247 const int g_light_level = static_cast<int>( light_level( u.posz() ) );
1248 const int light_sight_range = u.sight_range( g_light_level );
1249 int sight = std::max( veh_lumi( *veh ), light_sight_range );
1250
1251 // The maximal offset will leave at least this many tiles
1252 // between the PC and the edge of the main window.
1253 static const int border_range = 2;
1254 point max_offset( ( getmaxx( w_terrain ) + 1 ) / 2 - border_range - 1,
1255 ( getmaxy( w_terrain ) + 1 ) / 2 - border_range - 1 );
1256
1257 // velocity at or below this results in no offset at all
1258 static const float min_offset_vel = 1 * vehicles::vmiph_per_tile;
1259 // velocity at or above this results in maximal offset
1260 static const float max_offset_vel = std::min( max_offset.y, max_offset.x ) *
1262 float velocity = veh->velocity;
1263 rl_vec2d offset = veh->move_vec();
1264 if( !veh->skidding && veh->player_in_control( u ) &&
1265 std::abs( veh->cruise_velocity - veh->velocity ) < 7 * vehicles::vmiph_per_tile ) {
1266 // Use the cruise controlled velocity, but only if
1267 // it is not too different from the actual velocity.
1268 // The actual velocity changes too often (see above slowdown).
1269 // Using it makes would make the offset change far too often.
1270 offset = veh->face_vec();
1271 velocity = veh->cruise_velocity;
1272 }
1273 float rel_offset;
1274 if( std::fabs( velocity ) < min_offset_vel ) {
1275 rel_offset = 0;
1276 } else if( std::fabs( velocity ) > max_offset_vel ) {
1277 rel_offset = ( velocity > 0 ) ? 1 : -1;
1278 } else {
1279 rel_offset = ( velocity - min_offset_vel ) / ( max_offset_vel - min_offset_vel );
1280 }
1281 // Squeeze into the corners, by making the offset vector longer,
1282 // the PC is still in view as long as both offset.x and
1283 // offset.y are <= 1
1284 if( std::fabs( offset.x ) > std::fabs( offset.y ) && std::fabs( offset.x ) > 0.2 ) {
1285 offset.y /= std::fabs( offset.x );
1286 offset.x = ( offset.x > 0 ) ? +1 : -1;
1287 } else if( std::fabs( offset.y ) > 0.2 ) {
1288 offset.x /= std::fabs( offset.y );
1289 offset.y = offset.y > 0 ? +1 : -1;
1290 }
1291 offset.x *= rel_offset;
1292 offset.y *= rel_offset;
1293 offset.x *= max_offset.x;
1294 offset.y *= max_offset.y;
1295 // [ ----@---- ] sight=6
1296 // [ --@------ ] offset=2
1297 // [ -@------# ] offset=3
1298 // can see sights square in every direction, total visible area is
1299 // (2*sight+1)x(2*sight+1), but the window is only
1300 // getmaxx(w_terrain) x getmaxy(w_terrain)
1301 // The area outside of the window is maxoff (sight-getmax/2).
1302 // If that value is <= 0, the whole visible area fits the window.
1303 // don't apply the view offset at all.
1304 // If the offset is > maxoff, only apply at most maxoff, everything
1305 // above leads to invisible area in front of the car.
1306 // It will display (getmax/2+offset) squares in one direction and
1307 // (getmax/2-offset) in the opposite direction (centered on the PC).
1308 const point maxoff( ( sight * 2 + 1 - getmaxx( w_terrain ) ) / 2,
1309 ( sight * 2 + 1 - getmaxy( w_terrain ) ) / 2 );
1310 if( maxoff.x <= 0 ) {
1311 offset.x = 0;
1312 } else if( offset.x > 0 && offset.x > maxoff.x ) {
1313 offset.x = maxoff.x;
1314 } else if( offset.x < 0 && -offset.x > maxoff.x ) {
1315 offset.x = -maxoff.x;
1316 }
1317 if( maxoff.y <= 0 ) {
1318 offset.y = 0;
1319 } else if( offset.y > 0 && offset.y > maxoff.y ) {
1320 offset.y = maxoff.y;
1321 } else if( offset.y < 0 && -offset.y > maxoff.y ) {
1322 offset.y = -maxoff.y;
1323 }
1324
1325 // Turn the offset into a vector that increments the offset toward the desired position
1326 // instead of setting it there instantly, should smooth out jerkiness.
1327 const point offset_difference( -driving_view_offset + point( offset.x, offset.y ) );
1328
1329 const point offset_sign( ( offset_difference.x < 0 ) ? -1 : 1,
1330 ( offset_difference.y < 0 ) ? -1 : 1 );
1331 // Shift the current offset in the direction of the calculated offset by one tile
1332 // per draw event, but snap to calculated offset if we're close enough to avoid jitter.
1333 offset.x = ( std::abs( offset_difference.x ) > 1 ) ?
1334 ( driving_view_offset.x + offset_sign.x ) : offset.x;
1335 offset.y = ( std::abs( offset_difference.y ) > 1 ) ?
1336 ( driving_view_offset.y + offset_sign.y ) : offset.y;
1337
1338 set_driving_view_offset( point( offset.x, offset.y ) );
1339}
int posz() const override
Definition: character.h:792
int sight_range(int light_level) const override
Returns the player's sight range.
Definition: character.cpp:592
point driving_view_offset
Definition: game.h:997
catacurses::window w_terrain
Definition: game.h:987
void set_driving_view_offset(const point &p)
Definition: game.cpp:1598
unsigned char light_level(int zlev) const
Returns coarse number-of-squares of visibility at the current light level.
Definition: game.cpp:3540
rl_vec2d move_vec() const
rl_vec2d face_vec() const
bool skidding
Definition: vehicle.h:2024
bool player_in_control(const Character &p) const
Definition: vehicle.cpp:278
int velocity
Definition: vehicle.h:1943
int cruise_velocity
Definition: vehicle.h:1945
static int veh_lumi(vehicle &veh)
Definition: game.cpp:1223
int getmaxx(const window &win)
Definition: ncurses_def.cpp:58
int getmaxy(const window &win)
Definition: ncurses_def.cpp:63
quantity< V, U > fabs(quantity< V, U > q)
Definition: units_def.h:136
constexpr float vmiph_per_tile
Definition: vehicle.h:69
static constexpr point point_zero
Definition: point.h:260
Definition: point.h:35
int y
Definition: point.h:39
int x
Definition: point.h:38
float y
Definition: point_float.h:13
float x
Definition: point_float.h:12

References vehicle::cruise_velocity, driving_view_offset, units::fabs(), vehicle::face_vec(), catacurses::getmaxx(), catacurses::getmaxy(), light_level(), vehicle::move_vec(), vehicle::player_in_control(), point_zero, Character::posz(), set_driving_view_offset(), Character::sight_range(), vehicle::skidding, u, veh_lumi(), vehicle::velocity, vehicles::vmiph_per_tile, w_terrain, point::x, rl_vec2d::x, point::y, and rl_vec2d::y.

Referenced by do_turn().

◆ cancel_activity_or_ignore_query()

bool game::cancel_activity_or_ignore_query ( distraction_type  type,
const std::string &  text 
)

Asks if the player wants to cancel their activity and if so cancels it.

Additionally checks if the player wants to ignore further distractions.

Definition at line 1700 of file game.cpp.

1701{
1703 if( u.has_distant_destination() ) {
1704 if( cancel_auto_move( u, text ) ) {
1705 return true;
1706 } else {
1708 return false;
1709 }
1710 }
1712 return false;
1713 }
1714 const bool force_uc = get_option<bool>( "FORCE_CAPITAL_YN" );
1715 const auto &allow_key = force_uc ? input_context::disallow_lower_case
1717
1718 const auto &action = query_popup()
1719 .context( "CANCEL_ACTIVITY_OR_IGNORE_QUERY" )
1720 .message( force_uc ?
1721 pgettext( "cancel_activity_or_ignore_query",
1722 "<color_light_red>%s %s (Case Sensitive)</color>" ) :
1723 pgettext( "cancel_activity_or_ignore_query",
1724 "<color_light_red>%s %s</color>" ),
1725 text, u.activity.get_stop_phrase() )
1726 .option( "YES", allow_key )
1727 .option( "NO", allow_key )
1728 .option( "MANAGER", allow_key )
1729 .option( "IGNORE", allow_key )
1730 .query()
1731 .action;
1732
1733 if( action == "YES" ) {
1735 return true;
1736 }
1737 if( action == "IGNORE" ) {
1739 for( auto &activity : u.backlog ) {
1740 activity.ignore_distraction( type );
1741 }
1742 }
1743 if( action == "MANAGER" ) {
1746 return true;
1747 }
1748
1751
1752 return false;
1753}
void set_destination(const std::vector< tripoint > &route, const player_activity &new_destination_activity=player_activity())
void cancel_activity()
Definition: character.cpp:9188
std::vector< tripoint > & get_auto_move_route()
std::list< player_activity > backlog
Definition: character.h:1542
bool has_distant_destination() const
static const input_event_filter allow_all_keys
Definition: input.h:545
static const input_event_filter disallow_lower_case
Definition: input.h:544
bool is_distraction_ignored(distraction_type type) const
std::string get_stop_phrase() const
void ignore_distraction(distraction_type type)
UI class for displaying messages or querying player input with popups.
Definition: popup.h:39
query_popup & context(const std::string &cat)
Specify the input context.
Definition: popup.cpp:21
query_popup & option(const std::string &opt)
Specify an action as an option.
Definition: popup.cpp:28
result query()
Query until a valid action or an error happens and return the result.
Definition: popup.cpp:348
query_popup & message(const std::string &fmt, Args &&... args)
Specify the query message.
Definition: popup.h:91
@ action
Definition: dialogue.h:36
distraction_manager::distraction_manager_gui & get_distraction_manager()
@ type
Definition: enums.h:75
static bool cancel_auto_move(player &p, const std::string &text)
Definition: game.cpp:1687
void redraw()
Invalidate the top window and redraw all invalidated windows.
Definition: ui_manager.cpp:389
void refresh_display()
Make changes made to the display visible to the user immediately.
std::string action
Definition: popup.h:68
const char * pgettext(const char *context, const char *msgid)

References action, query_popup::result::action, Character::activity, input_context::allow_all_keys, Character::backlog, Character::cancel_activity(), cancel_auto_move(), query_popup::context(), input_context::disallow_lower_case, Character::get_auto_move_route(), get_distraction_manager(), player_activity::get_stop_phrase(), Character::has_distant_destination(), player_activity::ignore_distraction(), invalidate_main_ui_adaptor(), player_activity::is_distraction_ignored(), query_popup::message(), query_popup::option(), pgettext(), query_popup::query(), ui_manager::redraw(), refresh_display(), Character::set_destination(), distraction_manager::distraction_manager_gui::show(), type, and u.

Referenced by mon_info_update(), monmove(), and process_voluntary_act_interrupt().

◆ cancel_activity_query()

bool game::cancel_activity_query ( const std::string &  text)

Asks if the player wants to cancel their activity, and if so cancels it.

Definition at line 1755 of file game.cpp.

1756{
1758 if( u.has_distant_destination() ) {
1759 if( cancel_auto_move( u, text ) ) {
1760 return true;
1761 } else {
1763 return false;
1764 }
1765 }
1766 if( !u.activity ) {
1767 return false;
1768 }
1769 if( query_yn( "%s %s", text, u.activity.get_stop_phrase() ) ) {
1773 return true;
1774 }
1775 return false;
1776}
void clear_destination()
void resume_backlog_activity()
Definition: character.cpp:9220

References Character::activity, Character::cancel_activity(), cancel_auto_move(), Character::clear_destination(), Character::get_auto_move_route(), player_activity::get_stop_phrase(), Character::has_distant_destination(), invalidate_main_ui_adaptor(), query_yn(), Character::resume_backlog_activity(), Character::set_destination(), and u.

Referenced by handle_key_blocking_activity().

◆ catch_a_monster()

void game::catch_a_monster ( monster fish,
const tripoint pos,
player p,
const time_duration catch_duration 
)

Picks and spawns a random fish from the remaining fish list when a fish is caught.

Definition at line 1673 of file game.cpp.

1675{
1676 //spawn the corpse, rotten by a part of the duration
1678 catch_duration ) ) );
1679 if( u.sees( pos ) ) {
1680 u.add_msg_if_player( m_good, _( "You caught a %s." ), fish->type->nname() );
1681 }
1682 //quietly kill the caught
1683 fish->no_corpse_quiet = true;
1684 fish->die( p );
1685}
bool sees(const tripoint &t, bool is_player=false, int range_mod=0) const override
static item make_corpse(const mtype_id &mt=string_id< mtype >::NULL_ID(), time_point turn=calendar::turn, const std::string &name="", int upgrade_time=-1)
Make a corpse of the given monster type.
Definition: item.cpp:507
item & add_item_or_charges(const tripoint &pos, item obj, bool overflow=true)
Adds an item to map tile or stacks charges.
Definition: map.cpp:4294
bool no_corpse_quiet
Definition: monster.h:481
void die(Creature *killer) override
Empty function.
Definition: monster.cpp:2276
const mtype * type
Definition: monster.h:477
void add_msg_if_player(const std::string &msg) const override
Definition: player.cpp:380
time_point turn
Definition: calendar.cpp:36
mtype_id id
Definition: mtype.h:240
std::string nname(unsigned int quantity=1) const
Definition: mtype.cpp:65

References _, map::add_item_or_charges(), player::add_msg_if_player(), monster::die(), mtype::id, m, m_good, item::make_corpse(), mtype::nname(), monster::no_corpse_quiet, rng(), Character::sees(), calendar::turn, monster::type, and u.

◆ chat()

void game::chat ( )
private

Definition at line 395 of file npctalk.cpp.

396{
397 int volume = u.get_shout_volume();
398
399 const std::vector<npc *> available = get_npcs_if( [&]( const npc & guy ) {
400 // TODO: Get rid of the z-level check when z-level vision gets "better"
401 return u.posz() == guy.posz() && u.sees( guy.pos() ) &&
402 rl_dist( u.pos(), guy.pos() ) <= SEEX * 2;
403 } );
404 const int available_count = available.size();
405 const std::vector<npc *> followers = get_npcs_if( [&]( const npc & guy ) {
406 return guy.is_player_ally() && guy.is_following() && guy.can_hear( u.pos(), volume );
407 } );
408 const int follower_count = followers.size();
409 const std::vector<npc *> guards = get_npcs_if( [&]( const npc & guy ) {
410 return guy.mission == NPC_MISSION_GUARD_ALLY &&
411 guy.companion_mission_role_id != "FACTION_CAMP" &&
412 guy.can_hear( u.pos(), volume );
413 } );
414 const int guard_count = guards.size();
415
416 if( u.has_trait( trait_PROF_FOODP ) && !( u.is_wearing( itype_id( "foodperson_mask" ) ) ||
417 u.is_wearing( itype_id( "foodperson_mask_on" ) ) ) ) {
418 u.add_msg_if_player( m_warning, _( "You can't speak without your face!" ) );
419 return;
420 }
421 std::vector<vehicle *> animal_vehicles;
422 std::vector<vehicle *> following_vehicles;
423 std::vector<vehicle *> magic_vehicles;
424 std::vector<vehicle *> magic_following_vehicles;
425 for( auto &veh : m.get_vehicles() ) {
426 auto &v = veh.v;
427 if( v->has_engine_type( fuel_type_animal, false ) && v->is_owned_by( u ) ) {
428 animal_vehicles.push_back( v );
429 if( v->is_following ) {
430 following_vehicles.push_back( v );
431 }
432 }
433 if( v->magic ) {
434 for( const vpart_reference &vp : v->get_all_parts() ) {
435 const vpart_info &vpi = vp.info();
436 if( vpi.has_flag( "MAGIC_FOLLOW" ) ) {
437 magic_vehicles.push_back( v );
438 if( v->is_following ) {
439 magic_following_vehicles.push_back( v );
440 }
441 break;
442 }
443 }
444 }
445 }
446
447 uilist nmenu;
448 nmenu.text = std::string( _( "What do you want to do?" ) );
449
450 if( !available.empty() ) {
451 nmenu.addentry( NPC_CHAT_TALK, true, 't', available_count == 1 ?
452 string_format( _( "Talk to %s" ), available.front()->name ) :
453 _( "Talk to…" )
454 );
455 }
456 nmenu.addentry( NPC_CHAT_YELL, true, 'a', _( "Yell" ) );
457 nmenu.addentry( NPC_CHAT_SENTENCE, true, 'b', _( "Yell a sentence" ) );
458 if( !animal_vehicles.empty() ) {
460 _( "Whistle at your animals pulling vehicles to follow you." ) );
461 }
462 if( !magic_vehicles.empty() ) {
464 _( "Utter a magical command that will order your magical vehicles to follow you." ) );
465 }
466 if( !magic_following_vehicles.empty() ) {
468 _( "Utter a magical command that will order your magical vehicles to stop following you." ) );
469 }
470 if( !following_vehicles.empty() ) {
472 _( "Whistle at your animals pulling vehicles to stop following you." ) );
473 }
474 if( !guards.empty() ) {
475 nmenu.addentry( NPC_CHAT_FOLLOW, true, 'f', guard_count == 1 ?
476 string_format( _( "Tell %s to follow" ), guards.front()->name ) :
477 _( "Tell someone to follow…" )
478 );
479 }
480 if( !followers.empty() ) {
481 nmenu.addentry( NPC_CHAT_GUARD, true, 'g', follower_count == 1 ?
482 string_format( _( "Tell %s to guard" ), followers.front()->name ) :
483 _( "Tell someone to guard…" )
484 );
485 nmenu.addentry( NPC_CHAT_AWAKE, true, 'w', _( "Tell everyone on your team to wake up" ) );
486 nmenu.addentry( NPC_CHAT_MOUNT, true, 'M', _( "Tell everyone on your team to mount up" ) );
487 nmenu.addentry( NPC_CHAT_DISMOUNT, true, 'm', _( "Tell everyone on your team to dismount" ) );
488 nmenu.addentry( NPC_CHAT_DANGER, true, 'D',
489 _( "Tell everyone on your team to prepare for danger" ) );
490 nmenu.addentry( NPC_CHAT_CLEAR_OVERRIDES, true, 'r',
491 _( "Tell everyone on your team to relax (Clear Overrides)" ) );
492 nmenu.addentry( NPC_CHAT_ORDERS, true, 'o', _( "Tell everyone on your team to temporarily…" ) );
493 }
494 std::string message;
495 std::string yell_msg;
496 bool is_order = true;
497 nmenu.query();
498
499 if( nmenu.ret < 0 ) {
500 return;
501 }
502
503 switch( nmenu.ret ) {
504 case NPC_CHAT_TALK: {
505 const int npcselect = npc_select_menu( available, _( "Talk to whom?" ), false );
506 if( npcselect < 0 ) {
507 return;
508 }
509 available[npcselect]->talk_to_u();
510 break;
511 }
512 case NPC_CHAT_YELL:
513 is_order = false;
514 message = _( "loudly." );
515 break;
516 case NPC_CHAT_SENTENCE: {
517 std::string popupdesc = _( "Enter a sentence to yell" );
519 popup.title( _( "Yell a sentence" ) )
520 .width( 64 )
521 .description( popupdesc )
522 .identifier( "sentence" )
523 .max_length( 128 )
524 .query();
525 yell_msg = popup.text();
526 is_order = false;
527 break;
528 }
529 case NPC_CHAT_GUARD: {
530 const int npcselect = npc_select_menu( followers, _( "Who should guard here?" ) );
531 if( npcselect < 0 ) {
532 return;
533 }
534 if( npcselect == follower_count ) {
535 for( npc *them : followers ) {
537 }
538 yell_msg = _( "Everyone guard here!" );
539 } else {
540 talk_function::assign_guard( *followers[npcselect] );
541 yell_msg = string_format( _( "Guard here, %s!" ), followers[npcselect]->name );
542 }
543 break;
544 }
545 case NPC_CHAT_FOLLOW: {
546 const int npcselect = npc_select_menu( guards, _( "Who should follow you?" ) );
547 if( npcselect < 0 ) {
548 return;
549 }
550 if( npcselect == guard_count ) {
551 for( npc *them : guards ) {
553 }
554 yell_msg = _( "Everyone follow me!" );
555 } else {
556 talk_function::stop_guard( *guards[npcselect] );
557 yell_msg = string_format( _( "Follow me, %s!" ), guards[npcselect]->name );
558 }
559 break;
560 }
561 case NPC_CHAT_AWAKE:
562 for( npc *them : followers ) {
563 talk_function::wake_up( *them );
564 }
565 yell_msg = _( "Stay awake!" );
566 break;
567 case NPC_CHAT_MOUNT:
568 for( npc *them : followers ) {
569 if( them->has_effect( effect_riding ) ) {
570 continue;
571 }
573 }
574 yell_msg = _( "Mount up!" );
575 break;
577 for( npc *them : followers ) {
578 if( them->has_effect( effect_riding ) ) {
579 them->npc_dismount();
580 }
581 }
582 yell_msg = _( "Dismount!" );
583 break;
584 case NPC_CHAT_DANGER:
585 for( npc *them : followers ) {
586 them->rules.set_danger_overrides();
587 }
588 yell_msg = _( "We're in danger. Stay awake, stay close, don't go wandering off, "
589 "and don't open any doors." );
590 break;
592 for( npc *p : followers ) {
594 }
595 yell_msg = _( "As you were." );
596 break;
597 case NPC_CHAT_ORDERS:
598 npc_temp_orders_menu( followers );
599 break;
602 break;
605 break;
608 break;
611 break;
612 default:
613 return;
614 }
615
616 if( !yell_msg.empty() ) {
617 message = string_format( "\"%s\"", yell_msg );
618 }
619 if( !message.empty() ) {
620 add_msg( _( "You yell %s" ), message );
621 u.shout( string_format( _( "%s yelling %s" ), u.disp_name(), message ), is_order );
622 }
623
624 u.moves -= 100;
625}
std::string disp_name(bool possessive=false, bool capitalize_first=false) const override
Returns either "you" or the player's name.
Definition: character.cpp:566
void shout(std::string msg="", bool order=false)
Definition: character.cpp:7589
bool can_hear(const tripoint &source, int volume) const
bool is_wearing(const item &itm) const
Returns true if the player is wearing the item.
Definition: character.cpp:3201
bool has_trait(const trait_id &b) const override
Returns true if the player has the entered trait.
Definition: mutation.cpp:103
int get_shout_volume() const
Definition: character.cpp:7546
int moves
Definition: creature.h:574
std::string companion_mission_role_id
Definition: npc.h:1277
npc_mission mission
Definition: npc.h:1284
bool is_player_ally() const
Definition: npc.cpp:2003
bool is_following() const
Definition: npc.cpp:2034
Shows a window querying the user for input.
bool has_flag(const std::string &flag) const
Definition: veh_type.h:336
This is a wrapper over a vehicle pointer and a reference to a part of it.
int rl_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:519
static constexpr int SEEX
std::string message
Definition: mapgen.cpp:411
std::string name(type dir)
Get Human readable name of a direction.
Definition: overmap.cpp:4127
void wake_up(npc &)
void find_mount(npc &)
void clear_overrides(npc &p)
void stop_guard(npc &)
void assign_guard(npc &)
quantity< int, volume_in_milliliter_tag > volume
Definition: units_volume.h:16
@ NPC_MISSION_GUARD_ALLY
Definition: npc.h:150
static const efftype_id effect_riding("riding")
static const trait_id trait_PROF_FOODP("PROF_FOODP")
static int npc_select_menu(const std::vector< npc * > &npc_list, const std::string &prompt, const bool everyone=true)
Definition: npctalk.cpp:221
static void tell_magic_veh_stop_following()
Definition: npctalk.cpp:378
static void tell_veh_stop_following()
Definition: npctalk.cpp:341
static void assign_veh_to_follow()
Definition: npctalk.cpp:352
static void npc_temp_orders_menu(const std::vector< npc * > &npc_list)
Definition: npctalk.cpp:253
static const itype_id fuel_type_animal("animal")
@ NPC_CHAT_MOUNT
Definition: npctalk.cpp:201
@ NPC_CHAT_COMMAND_MAGIC_VEHICLE_STOP_FOLLOW
Definition: npctalk.cpp:215
@ NPC_CHAT_YELL
Definition: npctalk.cpp:196
@ NPC_CHAT_FOLLOW
Definition: npctalk.cpp:199
@ NPC_CHAT_GUARD
Definition: npctalk.cpp:198
@ NPC_CHAT_DISMOUNT
Definition: npctalk.cpp:202
@ NPC_CHAT_ANIMAL_VEHICLE_FOLLOW
Definition: npctalk.cpp:212
@ NPC_CHAT_ORDERS
Definition: npctalk.cpp:204
@ NPC_CHAT_SENTENCE
Definition: npctalk.cpp:197
@ NPC_CHAT_CLEAR_OVERRIDES
Definition: npctalk.cpp:211
@ NPC_CHAT_DANGER
Definition: npctalk.cpp:203
@ NPC_CHAT_AWAKE
Definition: npctalk.cpp:200
@ NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW
Definition: npctalk.cpp:213
@ NPC_CHAT_TALK
Definition: npctalk.cpp:195
@ NPC_CHAT_COMMAND_MAGIC_VEHICLE_FOLLOW
Definition: npctalk.cpp:214
static void tell_magic_veh_to_follow()
Definition: npctalk.cpp:362
int popup(const std::string &text, PopupFlags flags)
Definition: output.cpp:764

References _, add_msg(), player::add_msg_if_player(), uilist::addentry(), talk_function::assign_guard(), assign_veh_to_follow(), available, Character::can_hear(), talk_function::clear_overrides(), npc::companion_mission_role_id, Character::disp_name(), effect_riding, talk_function::find_mount(), fuel_type_animal, get_npcs_if(), Character::get_shout_volume(), map::get_vehicles(), vpart_info::has_flag(), Character::has_trait(), npc::is_following(), npc::is_player_ally(), Character::is_wearing(), m, m_warning, mapgen_defer::message, npc::mission, Creature::moves, om_direction::name(), NPC_CHAT_ANIMAL_VEHICLE_FOLLOW, NPC_CHAT_ANIMAL_VEHICLE_STOP_FOLLOW, NPC_CHAT_AWAKE, NPC_CHAT_CLEAR_OVERRIDES, NPC_CHAT_COMMAND_MAGIC_VEHICLE_FOLLOW, NPC_CHAT_COMMAND_MAGIC_VEHICLE_STOP_FOLLOW, NPC_CHAT_DANGER, NPC_CHAT_DISMOUNT, NPC_CHAT_FOLLOW, NPC_CHAT_GUARD, NPC_CHAT_MOUNT, NPC_CHAT_ORDERS, NPC_CHAT_SENTENCE, NPC_CHAT_TALK, NPC_CHAT_YELL, NPC_MISSION_GUARD_ALLY, npc_select_menu(), npc_temp_orders_menu(), popup(), Character::pos(), Character::posz(), uilist::query(), uilist::ret, rl_dist(), Character::sees(), SEEX, Character::shout(), talk_function::stop_guard(), string_format(), tell_magic_veh_stop_following(), tell_magic_veh_to_follow(), tell_veh_stop_following(), uilist::text, trait_PROF_FOODP, u, and talk_function::wake_up().

Referenced by handle_action().

◆ check_near_zone()

bool game::check_near_zone ( const zone_type_id type,
const tripoint where 
) const

Checks whether or not there is a zone of particular type nearby.

Definition at line 5988 of file game.cpp.

5989{
5990 return zone_manager::get_manager().has_near( type, m.getabs( where ) );
5991}
static zone_manager & get_manager()
Definition: clzones.cpp:126
bool has_near(const zone_type_id &type, const tripoint &where, int range=MAX_DISTANCE, const faction_id &fac=your_fac) const
Definition: clzones.cpp:702

References zone_manager::get_manager(), map::getabs(), zone_manager::has_near(), m, and type.

◆ check_safe_mode_allowed()

bool game::check_safe_mode_allowed ( bool  repeat_safe_mode_warnings = true)

Check whether movement is allowed according to safe mode settings.

Returns
true if the movement is allowed, otherwise false.

Definition at line 8527 of file game.cpp.

8528{
8529 if( !repeat_safe_mode_warnings && safe_mode_warning_logged ) {
8530 // Already warned player since safe_mode_warning_logged is set.
8531 return false;
8532 }
8533
8534 std::string msg_ignore = press_x( ACTION_IGNORE_ENEMY );
8535 if( !msg_ignore.empty() ) {
8536 std::wstring msg_ignore_wide = utf8_to_wstr( msg_ignore );
8537 // Operate on a wide-char basis to prevent corrupted multi-byte string
8538 msg_ignore_wide[0] = towlower( msg_ignore_wide[0] );
8539 msg_ignore = wstr_to_utf8( msg_ignore_wide );
8540 }
8541
8543 // Automatic and mandatory safemode. Make BLOODY sure the player notices!
8544 if( u.get_int_base() < 5 || u.has_trait( trait_id( "PROF_CHURL" ) ) ) {
8546 _( "There's an angry red dot on your body, %s to brush it off." ), msg_ignore );
8547 } else {
8549 _( "You are being laser-targeted, %s to ignore." ), msg_ignore );
8550 }
8552 return false;
8553 }
8554 if( safe_mode != SAFE_MODE_STOP ) {
8555 return true;
8556 }
8557 // Currently driving around, ignore the monster, they have no chance against a proper car anyway (-:
8558 if( u.controlling_vehicle && !get_option<bool>( "SAFEMODEVEH" ) ) {
8559 return true;
8560 }
8561 // Monsters around and we don't want to run
8562 std::string spotted_creature_name;
8563 const monster_visible_info &mon_visible = u.get_mon_visible();
8564 const auto &new_seen_mon = mon_visible.new_seen_mon;
8565
8566 if( new_seen_mon.empty() ) {
8567 // naming consistent with code in game::mon_info
8568 spotted_creature_name = _( "a survivor" );
8570 } else {
8571 spotted_creature_name = new_seen_mon.back()->name();
8572 get_safemode().lastmon_whitelist = spotted_creature_name;
8573 }
8574
8575 std::string whitelist;
8576 if( !get_safemode().empty() ) {
8577 whitelist = string_format( _( " or %s to whitelist the monster" ),
8579 }
8580
8581 const std::string msg_safe_mode = press_x( ACTION_TOGGLE_SAFEMODE );
8583 _( "Spotted %1$s--safe mode is on! (%2$s to turn it off, %3$s to ignore monster%4$s)" ),
8584 spotted_creature_name, msg_safe_mode, msg_ignore, whitelist );
8586 return false;
8587}
std::string press_x(action_id act)
Definition: action.cpp:457
@ ACTION_IGNORE_ENEMY
Ignore the enemy that triggered safemode.
Definition: action.h:221
@ ACTION_WHITELIST_ENEMY
Whitelist the enemy that triggered safemode.
Definition: action.h:223
@ ACTION_TOGGLE_SAFEMODE
Turn safemode on/off, while leaving autosafemode intact.
Definition: action.h:215
std::wstring utf8_to_wstr(const std::string &str)
std::string wstr_to_utf8(const std::wstring &wstr)
bool has_effect(const efftype_id &eff_id, body_part bp=num_bp) const
Check if creature has the matching effect.
Definition: creature.cpp:1185
int get_int_base() const override
Definition: avatar.cpp:1022
monster_visible_info & get_mon_visible()
Definition: avatar.h:218
std::string lastmon_whitelist
Definition: safemode_ui.h:87
std::string npc_type_name()
Definition: safemode_ui.cpp:44
@ gmf_bypass_cooldown
Definition: enums.h:288
static const efftype_id effect_laserlocked("laserlocked")
@ SAFE_MODE_STOP
Definition: game.h:79
safemode & get_safemode()
Definition: safemode_ui.cpp:33
Structure allowing a combination of game_message_type and game_message_flags.
Definition: enums.h:293
std::vector< shared_ptr_fast< monster > > new_seen_mon
Definition: avatar.h:41

References _, ACTION_IGNORE_ENEMY, ACTION_TOGGLE_SAFEMODE, ACTION_WHITELIST_ENEMY, add_msg(), Character::controlling_vehicle, effect_laserlocked, avatar::get_int_base(), avatar::get_mon_visible(), get_safemode(), gmf_bypass_cooldown, Creature::has_effect(), Character::has_trait(), safemode::lastmon_whitelist, m_warning, monster_visible_info::new_seen_mon, safemode::npc_type_name(), press_x(), safe_mode, SAFE_MODE_STOP, safe_mode_warning_logged, string_format(), u, utf8_to_wstr(), and wstr_to_utf8().

Referenced by handle_action().

◆ check_zone()

bool game::check_zone ( const zone_type_id type,
const tripoint where 
) const

Definition at line 5983 of file game.cpp.

5984{
5985 return zone_manager::get_manager().has( type, m.getabs( where ) );
5986}
bool has(const zone_type_id &type, const tripoint &where, const faction_id &fac=your_fac) const
Definition: clzones.cpp:694

References zone_manager::get_manager(), map::getabs(), zone_manager::has(), m, and type.

Referenced by place_player().

◆ cleanup_at_end()

bool game::cleanup_at_end ( )

Definition at line 937 of file game.cpp.

938{
939 if( uquit == QUIT_DIED || uquit == QUIT_SUICIDE ) {
940 // Put (non-hallucinations) into the overmap so they are not lost.
941 for( monster &critter : all_monsters() ) {
942 despawn_monster( critter );
943 }
944 // Reset NPC factions and disposition
946 // Save the factions', missions and set the NPC's overmap coordinates
947 // Npcs are saved in the overmap.
948 save_factions_missions_npcs(); //missions need to be saved as they are global for all saves.
949 // save artifacts.
951
952 // and the overmap, and the local map.
953 save_maps(); //Omap also contains the npcs who need to be saved.
954 }
955
956 if( uquit == QUIT_DIED || uquit == QUIT_SUICIDE ) {
957 std::vector<std::string> vRip;
958
959 int iMaxWidth = 0;
960 int iNameLine = 0;
961 int iInfoLine = 0;
962
965 if( !( u.has_trait( trait_id( "CANNIBAL" ) ) || u.has_trait( trait_id( "PSYCHOPATH" ) ) ) ) {
966 vRip.emplace_back( " _______ ___" );
967 vRip.emplace_back( " < `/ |" );
968 vRip.emplace_back( " > _ _ (" );
969 vRip.emplace_back( " | |_) | |_) |" );
970 vRip.emplace_back( " | | \\ | | |" );
971 vRip.emplace_back( " ______.__%_| |_________ __" );
972 vRip.emplace_back( " _/ \\| |" );
973 iNameLine = vRip.size();
974 vRip.emplace_back( "| <" );
975 vRip.emplace_back( "| |" );
976 iMaxWidth = utf8_width( vRip.back() );
977 vRip.emplace_back( "| |" );
978 vRip.emplace_back( "|_____.-._____ __/|_________|" );
979 vRip.emplace_back( " | |" );
980 iInfoLine = vRip.size();
981 vRip.emplace_back( " | |" );
982 vRip.emplace_back( " | <" );
983 vRip.emplace_back( " | |" );
984 vRip.emplace_back( " | _ |" );
985 vRip.emplace_back( " |__/ |" );
986 vRip.emplace_back( " % / `--. |%" );
987 vRip.emplace_back( " * .%%| -< @%%%" ); // NOLINT(cata-text-style)
988 vRip.emplace_back( " `\\%`@| |@@%@%%" );
989 vRip.emplace_back( " .%%%@@@|% ` % @@@%%@%%%%" );
990 vRip.emplace_back( " _.%%%%%%@@@@@@%%%__/\\%@@%%@@@@@@@%%%%%%" );
991
992 } else {
993 vRip.emplace_back( " _______ ___" );
994 vRip.emplace_back( " | \\/ |" );
995 vRip.emplace_back( " | |" );
996 vRip.emplace_back( " | |" );
997 iInfoLine = vRip.size();
998 vRip.emplace_back( " | |" );
999 vRip.emplace_back( " | |" );
1000 vRip.emplace_back( " | |" );
1001 vRip.emplace_back( " | |" );
1002 vRip.emplace_back( " | <" );
1003 vRip.emplace_back( " | _ |" );
1004 vRip.emplace_back( " |__/ |" );
1005 vRip.emplace_back( " ______.__%_| |__________ _" );
1006 vRip.emplace_back( " _/ \\| \\" );
1007 iNameLine = vRip.size();
1008 vRip.emplace_back( "| <" );
1009 vRip.emplace_back( "| |" );
1010 iMaxWidth = utf8_width( vRip.back() );
1011 vRip.emplace_back( "| |" );
1012 vRip.emplace_back( "|_____.-._______ __/|__________|" );
1013 vRip.emplace_back( " % / `_-. _ |%" );
1014 vRip.emplace_back( " * .%%| |_) | |_)< @%%%" ); // NOLINT(cata-text-style)
1015 vRip.emplace_back( " `\\%`@| | \\ | | |@@%@%%" );
1016 vRip.emplace_back( " .%%%@@@|% ` % @@@%%@%%%%" );
1017 vRip.emplace_back( " _.%%%%%%@@@@@@%%%__/\\%@@%%@@@@@@@%%%%%%" );
1018 }
1019 } else {
1020 vRip.emplace_back( R"( _________ ____ )" );
1021 vRip.emplace_back( R"( _/ `/ \_ )" );
1022 vRip.emplace_back( R"( _/ _ _ \_. )" );
1023 vRip.emplace_back( R"( _%\ |_) | |_) \_ )" );
1024 vRip.emplace_back( R"( _/ \/ | \ | | \_ )" );
1025 vRip.emplace_back( R"( _/ \_ )" );
1026 vRip.emplace_back( R"(| |)" );
1027 iNameLine = vRip.size();
1028 vRip.emplace_back( R"( ) < )" );
1029 vRip.emplace_back( R"(| |)" );
1030 vRip.emplace_back( R"(| |)" );
1031 vRip.emplace_back( R"(| _ |)" );
1032 vRip.emplace_back( R"(|__/ |)" );
1033 iMaxWidth = utf8_width( vRip.back() );
1034 vRip.emplace_back( R"( / `--. |)" );
1035 vRip.emplace_back( R"(| ( )" );
1036 iInfoLine = vRip.size();
1037 vRip.emplace_back( R"(| |)" );
1038 vRip.emplace_back( R"(| |)" );
1039 vRip.emplace_back( R"(| % . |)" );
1040 vRip.emplace_back( R"(| @` %% |)" );
1041 vRip.emplace_back( R"(| %@%@%\ * %`%@%|)" );
1042 vRip.emplace_back( R"(%%@@@.%@%\%% `\ %%.%%@@%@)" );
1043 vRip.emplace_back( R"(@%@@%%%%%@@@@@@%%%%%%%%@@%%@@@%%%@%%@)" );
1044 }
1045
1046 const int iOffsetX = TERMX > FULL_SCREEN_WIDTH ? ( TERMX - FULL_SCREEN_WIDTH ) / 2 : 0;
1047 const int iOffsetY = TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0;
1048
1050 point( iOffsetX, iOffsetY ) );
1051 draw_border( w_rip );
1052
1053 sfx::do_player_death_hurt( g->u, true );
1058
1059 for( size_t iY = 0; iY < vRip.size(); ++iY ) {
1060 size_t iX = 0;
1061 const char *str = vRip[iY].data();
1062 for( int slen = vRip[iY].size(); slen > 0; ) {
1063 const uint32_t cTemp = UTF8_getch( &str, &slen );
1064 if( cTemp != U' ' ) {
1065 nc_color ncColor = c_light_gray;
1066
1067 if( cTemp == U'%' ) {
1068 ncColor = c_green;
1069
1070 } else if( cTemp == U'_' || cTemp == U'|' ) {
1071 ncColor = c_white;
1072
1073 } else if( cTemp == U'@' ) {
1074 ncColor = c_brown;
1075
1076 } else if( cTemp == U'*' ) {
1077 ncColor = c_red;
1078 }
1079
1080 mvwputch( w_rip, point( iX + FULL_SCREEN_WIDTH / 2 - ( iMaxWidth / 2 ), iY + 1 ), ncColor,
1081 cTemp );
1082 }
1083 iX += mk_wcwidth( cTemp );
1084 }
1085 }
1086
1087 std::string sTemp;
1088
1089 center_print( w_rip, iInfoLine++, c_white, _( "Survived:" ) );
1090
1092 const int minutes = to_minutes<int>( survived ) % 60;
1093 const int hours = to_hours<int>( survived ) % 24;
1094 const int days = to_days<int>( survived );
1095
1096 if( days > 0 ) {
1097 sTemp = string_format( "%dd %dh %dm", days, hours, minutes );
1098 } else if( hours > 0 ) {
1099 sTemp = string_format( "%dh %dm", hours, minutes );
1100 } else {
1101 sTemp = string_format( "%dm", minutes );
1102 }
1103
1104 center_print( w_rip, iInfoLine++, c_white, sTemp );
1105
1106 const int iTotalKills = get_kill_tracker().monster_kill_count();
1107
1108 sTemp = _( "Kills:" );
1109 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - 5, 1 + iInfoLine++ ), c_light_gray,
1110 ( sTemp + " " ) );
1111 wprintz( w_rip, c_magenta, "%d", iTotalKills );
1112
1113 sTemp = _( "In memory of:" );
1114 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ),
1116 sTemp );
1117
1118 sTemp = u.name;
1119 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ), c_white,
1120 sTemp );
1121
1122 sTemp = _( "Last Words:" );
1123 mvwprintz( w_rip, point( FULL_SCREEN_WIDTH / 2 - utf8_width( sTemp ) / 2, iNameLine++ ),
1125 sTemp );
1126
1127 int iStartX = FULL_SCREEN_WIDTH / 2 - ( ( iMaxWidth - 4 ) / 2 );
1128 std::string sLastWords = string_input_popup()
1129 .window( w_rip, point( iStartX, iNameLine ), iStartX + iMaxWidth - 4 - 1 )
1130 .max_length( iMaxWidth - 4 - 1 )
1131 .query_string();
1132 death_screen();
1133 const bool is_suicide = uquit == QUIT_SUICIDE;
1134 events().send<event_type::game_over>( is_suicide, sLastWords );
1135 // Struck the save_player_data here to forestall Weirdness
1136 std::string char_filename = generate_memorial_filename( u.name );
1137 move_save_to_graveyard( char_filename );
1138 write_memorial_file( char_filename, sLastWords );
1139 memorial().clear();
1140 std::vector<std::string> characters = list_active_characters();
1141 // remove current player from the active characters list, as they are dead
1142 std::vector<std::string>::iterator curchar = std::find( characters.begin(),
1143 characters.end(), u.name );
1144 if( curchar != characters.end() ) {
1145 characters.erase( curchar );
1146 }
1147
1148 if( characters.empty() ) {
1149 bool queryDelete = false;
1150 bool queryReset = false;
1151
1152 if( get_option<std::string>( "WORLD_END" ) == "query" ) {
1153 bool decided = false;
1154 std::string buffer = _( "Warning: NPC interactions and some other global flags "
1155 "will not all reset when starting a new character in an "
1156 "already-played world. This can lead to some strange "
1157 "behavior.\n\n"
1158 "Are you sure you wish to keep this world?"
1159 );
1160
1161 while( !decided ) {
1162 uilist smenu;
1163 smenu.allow_cancel = false;
1164 smenu.addentry( 0, true, 'r', "%s", _( "Reset world" ) );
1165 smenu.addentry( 1, true, 'd', "%s", _( "Delete world" ) );
1166 smenu.addentry( 2, true, 'k', "%s", _( "Keep world" ) );
1167 smenu.query();
1168
1169 switch( smenu.ret ) {
1170 case 0:
1171 queryReset = true;
1172 decided = true;
1173 break;
1174 case 1:
1175 queryDelete = true;
1176 decided = true;
1177 break;
1178 case 2:
1179 decided = query_yn( buffer );
1180 break;
1181 }
1182 }
1183 }
1184
1185 if( queryDelete || get_option<std::string>( "WORLD_END" ) == "delete" ) {
1186 world_generator->delete_world( world_generator->active_world->world_name, true );
1187
1188 } else if( queryReset || get_option<std::string>( "WORLD_END" ) == "reset" ) {
1189 world_generator->delete_world( world_generator->active_world->world_name, false );
1190 }
1191 } else if( get_option<std::string>( "WORLD_END" ) != "keep" ) {
1192 std::string tmpmessage;
1193 for( auto &character : characters ) {
1194 tmpmessage += "\n ";
1195 tmpmessage += character;
1196 }
1197 popup( _( "World retained. Characters remaining:%s" ), tmpmessage );
1198 }
1199 if( gamemode ) {
1200 gamemode = std::make_unique<special_game>(); // null gamemode or something..
1201 }
1202 }
1203
1204 //Reset any offset due to driving
1206
1207 //clear all sound channels
1213
1214 MAPBUFFER.reset();
1216
1217#if defined(__ANDROID__)
1218 quick_shortcuts_map.clear();
1219#endif
1220 return true;
1221}
uint32_t UTF8_getch(const char **src, int *srclen)
Definition: catacharset.cpp:18
int utf8_width(const char *s, const bool ignore_tags)
std::string name
Definition: character.h:1529
A wrapper over a pointer to a curses window.
Definition: cursesdef.h:55
void send(const cata::event &) const
Definition: event_bus.cpp:58
void move_save_to_graveyard(const std::string &dirname)
Definition: game.cpp:2463
bool save_maps()
Definition: game.cpp:2663
std::unique_ptr< special_game > gamemode
Definition: game.h:1055
void death_screen()
Definition: game.cpp:2412
monster_range all_monsters()
Same as all_creatures but iterators only over monsters.
Definition: game.cpp:11949
bool save_factions_missions_npcs()
Definition: game.cpp:2649
void despawn_monster(monster &critter)
Despawn a specific monster, it's stored on the overmap.
Definition: game.cpp:10973
const kill_tracker & get_kill_tracker() const
Definition: game.cpp:876
void write_memorial_file(const std::string &filename, std::string sLastWords)
Writes information about the character out to a text file timestamped with the time of the file was m...
Definition: game.cpp:2762
std::vector< std::string > list_active_characters()
Returns a list of currently active character saves.
Definition: game.cpp:2747
bool save_artifacts()
Definition: game.cpp:2657
memorial_logger & memorial()
Definition: game.cpp:2712
void reset_npc_dispositions()
Definition: game.cpp:2621
int monster_kill_count() const
void reset()
Delete all buffered submaps.
Definition: mapbuffer.cpp:49
string_input_popup & max_length(int value)
Maximal amount of Unicode characters that can be given by the user.
const std::string & query_string(bool loop=true, bool draw_only=false)
string_input_popup & window(const catacurses::window &w, const point &start, int endx)
Set the window area where to display the input text.
A duration defined as a number of specific time units.
Definition: calendar.h:180
bool allow_cancel
Definition: ui.h:362
bool has_amount(const itype_id &what, int qty, bool pseudo=true, const std::function< bool(const item &)> &filter=return_true< item >) const
Check instance provides at least qty of an item (.
Definition: visitable.cpp:1108
#define c_white
Definition: color.h:18
#define c_light_gray
Definition: color.h:19
#define c_green
Definition: color.h:22
#define c_magenta
Definition: color.h:25
#define c_brown
Definition: color.h:26
#define c_red
Definition: color.h:21
static const itype_id itype_holybook_bible1("holybook_bible1")
static std::string generate_memorial_filename(const std::string &char_name)
Definition: game.cpp:910
static const itype_id itype_holybook_bible2("holybook_bible2")
static const itype_id itype_holybook_bible3("holybook_bible3")
std::unique_ptr< game > g
Definition: game.cpp:281
@ QUIT_DIED
Definition: game.h:72
@ QUIT_SUICIDE
Definition: game.h:69
const time_point & start_of_cataclysm
Definition: calendar.cpp:33
window newwin(int nlines, int ncols, const point &begin)
Definition: ncurses_def.cpp:34
FMT_CONSTEXPR bool find(Ptr first, Ptr last, T value, Ptr &out)
const size_t size
Definition: om_direction.h:27
void do_player_death_hurt(const player &target, bool death)
Definition: sounds.cpp:1631
void fade_audio_channel(channel channel, int duration)
Definition: sounds.cpp:1616
void fade_audio_group(group group, int duration)
Definition: sounds.cpp:1615
int TERMX
Definition: output.cpp:47
void mvwprintz(const catacurses::window &w, const point &p, const nc_color &FG, const std::string &text)
Definition: output.cpp:2081
int FULL_SCREEN_HEIGHT
Definition: output.cpp:56
int TERMY
Definition: output.cpp:48
void center_print(const catacurses::window &w, const int y, const nc_color &FG, const std::string &text)
Definition: output.cpp:446
void wprintz(const catacurses::window &w, const nc_color &FG, const std::string &text)
Definition: output.cpp:2089
int FULL_SCREEN_WIDTH
Definition: output.cpp:55
void mvwputch(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:477
void draw_border(const catacurses::window &w, nc_color border_color, const std::string &title, nc_color title_color)
Definition: output.cpp:575
overmapbuffer overmap_buffer
int mk_wcwidth(uint32_t ucs)
Definition: wcwidth.cpp:94

References _, uilist::addentry(), all_monsters(), uilist::allow_cancel, sfx::any, c_brown, c_green, c_light_gray, c_magenta, c_red, c_white, center_print(), memorial_logger::clear(), overmapbuffer::clear(), sfx::context_themes, death_screen(), despawn_monster(), sfx::do_player_death_hurt(), draw_border(), events(), sfx::fade_audio_channel(), sfx::fade_audio_group(), sfx::fatigue, detail::find(), FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, g, game_over, gamemode, generate_memorial_filename(), get_kill_tracker(), visitable< T >::has_amount(), Character::has_trait(), itype_holybook_bible1, itype_holybook_bible2, itype_holybook_bible3, list_active_characters(), MAPBUFFER, string_input_popup::max_length(), memorial(), mk_wcwidth(), kill_tracker::monster_kill_count(), move_save_to_graveyard(), mvwprintz(), mvwputch(), Character::name, catacurses::newwin(), overmap_buffer, point_zero, popup(), uilist::query(), string_input_popup::query_string(), query_yn(), QUIT_DIED, QUIT_SUICIDE, mapbuffer::reset(), reset_npc_dispositions(), uilist::ret, save_artifacts(), save_factions_missions_npcs(), save_maps(), event_bus::send(), set_driving_view_offset(), om_direction::size, calendar::start_of_cataclysm, string_format(), TERMX, TERMY, sfx::time_of_day, calendar::turn, u, uquit, UTF8_getch(), utf8_width(), sfx::weather, string_input_popup::window(), world_generator, wprintz(), and write_memorial_file().

Referenced by do_turn().

◆ cleanup_dead()

void game::cleanup_dead ( )

Definition at line 4016 of file game.cpp.

4017{
4018 // Dead monsters need to stay in the tracker until everything else that needs to die does so
4019 // This is because dying monsters can still interact with other dying monsters (@ref Creature::killer)
4020 bool monster_is_dead = critter_tracker->kill_marked_for_death();
4021
4022 bool npc_is_dead = false;
4023 // can't use all_npcs as that does not include dead ones
4024 for( const auto &n : active_npc ) {
4025 if( n->is_dead() ) {
4026 n->die( nullptr ); // make sure this has been called to create corpses etc.
4027 npc_is_dead = true;
4028 }
4029 }
4030
4031 if( monster_is_dead ) {
4032 // From here on, pointers to creatures get invalidated as dead creatures get removed.
4033 critter_tracker->remove_dead();
4034 }
4035
4036 if( npc_is_dead ) {
4037 for( auto it = active_npc.begin(); it != active_npc.end(); ) {
4038 if( ( *it )->is_dead() ) {
4039 remove_npc_follower( ( *it )->getID() );
4040 overmap_buffer.remove_npc( ( *it )->getID() );
4041 it = active_npc.erase( it );
4042 } else {
4043 it++;
4044 }
4045 }
4046 }
4047
4048 critter_died = false;
4049}
void remove_npc_follower(const character_id &id)
Remove follower id from follower set.
Definition: game.cpp:1880
pimpl< Creature_tracker > critter_tracker
Definition: game.h:973
std::list< shared_ptr_fast< npc > > active_npc
Definition: game.h:1037
bool critter_died
Has anything died in this turn and needs to be cleaned up?
Definition: game.h:1049
shared_ptr_fast< npc > remove_npc(const character_id &id)
Find npc by id and if found, erase it from the npc list and return it ( or return nullptr if not foun...

References active_npc, critter_died, critter_tracker, overmap_buffer, overmapbuffer::remove_npc(), and remove_npc_follower().

Referenced by do_turn(), and monmove().

◆ clear_zombies()

void game::clear_zombies ( )

Redirects to the creature_tracker clear() function.

Definition at line 4693 of file game.cpp.

4694{
4695 critter_tracker->clear();
4696}

References critter_tracker.

Referenced by setup().

◆ control_vehicle()

void game::control_vehicle ( )
private

Definition at line 5137 of file game.cpp.

5138{
5139 static const itype_id fuel_type_animal( "animal" );
5140 int veh_part = -1;
5141 vehicle *veh = remoteveh();
5142 if( veh == nullptr ) {
5143 if( const optional_vpart_position vp = m.veh_at( u.pos() ) ) {
5144 veh = &vp->vehicle();
5145 veh_part = vp->part_index();
5146 }
5147 }
5148 if( veh != nullptr && veh->player_in_control( u ) &&
5149 veh->avail_part_with_feature( veh_part, "CONTROLS", true ) >= 0 ) {
5150 veh->use_controls( u.pos() );
5151 } else if( veh && veh->player_in_control( u ) &&
5152 veh->avail_part_with_feature( veh_part, "CONTROL_ANIMAL", true ) >= 0 ) {
5153 u.controlling_vehicle = false;
5154 add_msg( m_info, _( "You let go of the reins." ) );
5155 } else if( veh && ( veh->avail_part_with_feature( veh_part, "CONTROLS", true ) >= 0 ||
5156 ( veh->avail_part_with_feature( veh_part, "CONTROL_ANIMAL", true ) >= 0 &&
5157 veh->has_engine_type( fuel_type_animal, false ) && veh->has_harnessed_animal() ) ) &&
5158 u.in_vehicle ) {
5159 if( u.has_trait( trait_WAYFARER ) ) {
5160 add_msg( m_info, _( "You refuse to take control of this vehicle." ) );
5161 return;
5162 }
5163 if( !veh->interact_vehicle_locked() ) {
5164 veh->handle_potential_theft( u );
5165 return;
5166 }
5167 if( veh->engine_on ) {
5168 if( !veh->handle_potential_theft( u ) ) {
5169 return;
5170 }
5171 u.controlling_vehicle = true;
5172 add_msg( _( "You take control of the %s." ), veh->name );
5173 } else {
5174 if( !veh->handle_potential_theft( u ) ) {
5175 return;
5176 }
5177 veh->start_engines( true );
5178 }
5179 } else { // Start looking for nearby vehicle controls.
5180 int num_valid_controls = 0;
5181 cata::optional<tripoint> vehicle_position;
5182 cata::optional<vpart_reference> vehicle_controls;
5183 for( const tripoint elem : m.points_in_radius( g->u.pos(), 1 ) ) {
5184 if( const optional_vpart_position vp = m.veh_at( elem ) ) {
5185 const cata::optional<vpart_reference> controls = vp.value().part_with_feature( "CONTROLS", true );
5186 if( controls ) {
5187 num_valid_controls++;
5188 vehicle_position = elem;
5189 vehicle_controls = controls;
5190 }
5191 }
5192 }
5193 if( num_valid_controls < 1 ) {
5194 add_msg( _( "No vehicle controls found." ) );
5195 return;
5196 } else if( num_valid_controls > 1 ) {
5197 vehicle_position = choose_adjacent( _( "Control vehicle where?" ) );
5198 if( !vehicle_position ) {
5199 return;
5200 }
5201 const optional_vpart_position vp = m.veh_at( *vehicle_position );
5202 if( vp ) {
5203 vehicle_controls = vp.value().part_with_feature( "CONTROLS", true );
5204 if( !vehicle_controls ) {
5205 add_msg( _( "The vehicle doesn't have controls there." ) );
5206 return;
5207 }
5208 } else {
5209 add_msg( _( "No vehicle there." ) );
5210 return;
5211 }
5212 }
5213 // If we hit neither of those, there's only one set of vehicle controls, which should already have been found.
5214 if( vehicle_controls ) {
5215 veh = &vehicle_controls->vehicle();
5216 if( !veh->handle_potential_theft( u ) ) {
5217 return;
5218 }
5219 veh->use_controls( *vehicle_position );
5220 //May be folded up (destroyed), so need to re-get it
5221 veh = g->remoteveh();
5222 }
5223 }
5224 if( veh ) {
5225 // If we reached here, we gained control of a vehicle.
5226 // Clear the map memory for the area covered by the vehicle to eliminate ghost vehicles.
5227 for( const tripoint &target : veh->get_points() ) {
5228 u.clear_memorized_tile( m.getabs( target ) );
5229 }
5230 veh->is_following = false;
5231 veh->is_patrolling = false;
5232 veh->autopilot_on = false;
5233 veh->is_autodriving = false;
5234 }
5235}
cata::optional< tripoint > choose_adjacent(const std::string &message, const bool allow_vertical)
Request player input of adjacent tile, possibly including vertical tiles.
Definition: action.cpp:1026
bool in_vehicle
Definition: character.h:1536
void clear_memorized_tile(const tripoint &pos)
Definition: avatar.cpp:168
vehicle * remoteveh()
Returns the current remotely controlled vehicle.
Definition: game.cpp:2248
tripoint_range< tripoint > points_in_radius(const tripoint &center, size_t radius, size_t radiusz=0) const
Definition: map.cpp:8679
optional_vpart_position veh_at(const tripoint &p) const
Checks if tile is occupied by vehicle and by which part.
Definition: map.cpp:1067
Simple wrapper to forward functions that may return a cata::optional to vpart_position.
bool engine_on
Definition: vehicle.h:2014
std::set< tripoint > & get_points(bool force_refresh=false)
Definition: vehicle.cpp:6762
std::string name
Definition: vehicle.h:1874
bool has_engine_type(const itype_id &ft, bool enabled) const
Definition: vehicle.cpp:1032
void start_engines(bool take_control=false, bool autodrive=false)
void use_controls(const tripoint &pos)
Operate vehicle controls.
vehicle(const vproto_id &type_id, int init_veh_fuel=-1, int init_veh_status=-1)
Definition: vehicle.cpp:252
bool has_harnessed_animal() const
bool interact_vehicle_locked()
int avail_part_with_feature(int p, const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2546
bool autopilot_on
Definition: vehicle.h:2022
bool is_autodriving
Definition: vehicle.h:2007
bool handle_potential_theft(avatar &you, bool check_only=false, bool prompt=true)
Handle potential vehicle theft.
Definition: vehicle.cpp:4388
cata::optional< vpart_reference > part_with_feature(const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2462
static const trait_id trait_WAYFARER("WAYFARER")

References _, add_msg(), vehicle::autopilot_on, vehicle::avail_part_with_feature(), choose_adjacent(), avatar::clear_memorized_tile(), Character::controlling_vehicle, vehicle::engine_on, fuel_type_animal, g, vehicle::get_points(), map::getabs(), vehicle::handle_potential_theft(), vehicle::has_engine_type(), vehicle::has_harnessed_animal(), Character::has_trait(), Character::in_vehicle, vehicle::interact_vehicle_locked(), vehicle::is_autodriving, vehicle::is_following, vehicle::is_patrolling, m, m_info, vehicle::name, vpart_position::part_with_feature(), vehicle::player_in_control(), map::points_in_radius(), Character::pos(), remoteveh(), vehicle::start_engines(), trait_WAYFARER, u, vehicle::use_controls(), cata::optional< T >::value(), map::veh_at(), and vehicle::vehicle().

Referenced by handle_action().

◆ create_or_get_main_ui_adaptor()

shared_ptr_fast< ui_adaptor > game::create_or_get_main_ui_adaptor ( )

In tiles mode w_terrain can have a different font (with a different tile dimension) or can be drawn by cata_tiles which uses tiles that again might have a different dimension then the normal font used everywhere else.

TERRAIN_WINDOW_WIDTH/TERRAIN_WINDOW_HEIGHT defines how many squares can be displayed in w_terrain (using it's specific tile dimension), not including partially drawn squares at the right/bottom. You should use it whenever you want to draw specific squares in that window or to determine whether a specific square is draw on screen (or outside the screen and needs scrolling).

TERRAIN_WINDOW_TERM_WIDTH/TERRAIN_WINDOW_TERM_HEIGHT defines the size of w_terrain in the standard font dimension (the font that everything else uses). You usually don't have to use it, expect for positioning of windows, because the window positions use the standard font dimension.

The code here calculates size available for w_terrain, caps it at max_view_size (the maximal view range than any character can have at any time). It is stored in TERRAIN_WINDOW_*.

Definition at line 2899 of file game.cpp.

2900{
2902 if( !ui ) {
2903 main_ui_adaptor = ui = make_shared_fast<ui_adaptor>();
2904 ui->on_redraw( []( const ui_adaptor & ) {
2905 g->draw();
2906 } );
2907 ui->on_screen_resize( [this]( ui_adaptor & ui ) {
2908 // remove some space for the sidebar, this is the maximal space
2909 // (using standard font) that the terrain window can have
2910 const int sidebar_left = panel_manager::get_manager().get_width_left();
2911 const int sidebar_right = panel_manager::get_manager().get_width_right();
2912
2914 TERRAIN_WINDOW_WIDTH = TERMX - ( sidebar_left + sidebar_right );
2917
2918 /**
2919 * In tiles mode w_terrain can have a different font (with a different
2920 * tile dimension) or can be drawn by cata_tiles which uses tiles that again
2921 * might have a different dimension then the normal font used everywhere else.
2922 *
2923 * TERRAIN_WINDOW_WIDTH/TERRAIN_WINDOW_HEIGHT defines how many squares can
2924 * be displayed in w_terrain (using it's specific tile dimension), not
2925 * including partially drawn squares at the right/bottom. You should
2926 * use it whenever you want to draw specific squares in that window or to
2927 * determine whether a specific square is draw on screen (or outside the screen
2928 * and needs scrolling).
2929 *
2930 * TERRAIN_WINDOW_TERM_WIDTH/TERRAIN_WINDOW_TERM_HEIGHT defines the size of
2931 * w_terrain in the standard font dimension (the font that everything else uses).
2932 * You usually don't have to use it, expect for positioning of windows,
2933 * because the window positions use the standard font dimension.
2934 *
2935 * The code here calculates size available for w_terrain, caps it at
2936 * max_view_size (the maximal view range than any character can have at
2937 * any time).
2938 * It is stored in TERRAIN_WINDOW_*.
2939 */
2941
2942 // Position of the player in the terrain window, it is always in the center
2945
2947 point( sidebar_left, 0 ) );
2948
2949 // minimap is always MINIMAP_WIDTH x MINIMAP_HEIGHT in size
2951
2952 // need to init in order to avoid crash. gets updated by the panel code.
2954
2955 ui.position_from_window( catacurses::stdscr );
2956 } );
2957 ui->mark_resize();
2958 }
2959 return ui;
2960}
catacurses::window w_pixel_minimap
Definition: game.h:991
catacurses::window w_minimap_ptr
Definition: game.h:1028
weak_ptr_fast< ui_adaptor > main_ui_adaptor
Definition: game.h:1074
catacurses::window w_minimap
Definition: game.h:990
catacurses::window w_terrain_ptr
Definition: game.h:1027
static panel_manager & get_manager()
Definition: panels.h:72
int get_width_right()
Definition: panels.cpp:2175
int get_width_left()
Definition: panels.cpp:2183
Adaptor between UI code and the UI management system.
Definition: ui_manager.h:65
static constexpr int MINIMAP_WIDTH
static constexpr int MINIMAP_HEIGHT
void to_map_font_dimension(int &, int &)
Definition: game_ui.cpp:20
std::shared_ptr< T > shared_ptr_fast
Definition: memory_fast.h:16
window stdscr
Definition: overmap_ui.h:17
int TERRAIN_WINDOW_TERM_WIDTH
Definition: output.cpp:53
int TERRAIN_WINDOW_TERM_HEIGHT
Definition: output.cpp:54
int POSX
Definition: output.cpp:49
int TERRAIN_WINDOW_WIDTH
Definition: output.cpp:51
int POSY
Definition: output.cpp:50
int TERRAIN_WINDOW_HEIGHT
Definition: output.cpp:52

References g, panel_manager::get_manager(), panel_manager::get_width_left(), panel_manager::get_width_right(), main_ui_adaptor, MINIMAP_HEIGHT, MINIMAP_WIDTH, catacurses::newwin(), point_zero, POSX, POSY, catacurses::stdscr, TERMX, TERMY, TERRAIN_WINDOW_HEIGHT, TERRAIN_WINDOW_TERM_HEIGHT, TERRAIN_WINDOW_TERM_WIDTH, TERRAIN_WINDOW_WIDTH, to_map_font_dimension(), w_minimap, w_minimap_ptr, w_pixel_minimap, w_terrain, and w_terrain_ptr.

◆ create_starting_npcs()

void game::create_starting_npcs ( )
private

Definition at line 881 of file game.cpp.

882{
883 if( !get_option<bool>( "STATIC_NPC" ) ||
884 get_option<std::string>( "STARTING_NPC" ) == "never" ) {
885 return; //Do not generate a starting npc.
886 }
887
888 //We don't want more than one starting npc per starting location
889 const int radius = 1;
890 if( !overmap_buffer.get_npcs_near_player( radius ).empty() ) {
891 return; //There is already an NPC in this starting location
892 }
893
894 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
895 tmp->randomize( one_in( 2 ) ? NC_DOCTOR : NC_NONE );
896 tmp->spawn_at_precise( { get_levx(), get_levy() }, u.pos() - point_south_east );
898 tmp->form_opinion( u );
899 tmp->set_attitude( NPCATT_NULL );
900 //This sets the NPC mission. This NPC remains in the starting location.
901 tmp->mission = NPC_MISSION_SHELTER;
902 tmp->chatbin.first_topic = "TALK_SHELTER";
903 tmp->toggle_trait( trait_id( "NPC_STARTING_NPC" ) );
904 tmp->set_fac( faction_id( "no_faction" ) );
905 //One random starting NPC mission
906 tmp->add_new_mission( mission::reserve_random( ORIGIN_OPENER_NPC, tmp->global_omt_location(),
907 tmp->getID() ) );
908}
int get_levy() const
Definition: game.cpp:11839
int get_levx() const
The top left corner of the reality bubble (in submaps coordinates).
Definition: game.cpp:11834
static mission * reserve_random(mission_origin origin, const tripoint_abs_omt &p, const character_id &npc_id)
Definition: mission.cpp:200
std::vector< shared_ptr_fast< npc > > get_npcs_near_player(int radius)
Same as get_npcs_near(int,int,int,int) but uses player position as center.
void insert_npc(const shared_ptr_fast< npc > &who)
Adds the npc to an overmap ( based on the npcs current location ) and stores it there.
string_id< faction > faction_id
Definition: clzones.h:30
@ ORIGIN_OPENER_NPC
Definition: mission.h:45
@ NPCATT_NULL
Definition: npc.h:81
@ NPC_MISSION_SHELTER
Definition: npc.h:144
npc_class_id NC_NONE("NC_NONE")
npc_class_id NC_DOCTOR("NC_DOCTOR")
static constexpr point point_south_east
Definition: point.h:265
bool one_in(int chance)
Definition: rng.cpp:65

References get_levx(), get_levy(), overmapbuffer::get_npcs_near_player(), overmapbuffer::insert_npc(), NC_DOCTOR, NC_NONE, NPC_MISSION_SHELTER, NPCATT_NULL, one_in(), ORIGIN_OPENER_NPC, overmap_buffer, point_south_east, Character::pos(), mission::reserve_random(), trait_id, and u.

Referenced by start_game().

◆ critter_at() [1/2]

template<typename T >
T * game::critter_at ( const tripoint p,
bool  allow_hallucination = false 
)

Returns the Creature at the given location.

Optionally casted to the given type of creature: npc, player, monster - if there is a creature, but it's not of the requested type, returns nullptr.

Parameters
allow_hallucinationWhether to return monsters that are actually hallucinations.

Definition at line 4498 of file game.cpp.

4499{
4500 if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( p ) ) {
4501 if( !allow_hallucination && mon_ptr->is_hallucination() ) {
4502 return nullptr;
4503 }
4504 // if we wanted to check for an NPC / player / avatar,
4505 // there is sometimes a monster AND an NPC/player there at the same time.
4506 // because the NPC/player etc may be riding that monster.
4507 // so only return the monster if we were actually looking for a monster.
4508 // otherwise, keep looking for the rider.
4509 // critter_at<creature> or critter_at() with no template will still default to returning monster first,
4510 // which is ok for the occasions where that happens.
4511 if( !mon_ptr->has_effect( effect_ridden ) || ( std::is_same<T, monster>::value ||
4512 std::is_same<T, Creature>::value || std::is_same<T, const monster>::value ||
4513 std::is_same<T, const Creature>::value ) ) {
4514 return dynamic_cast<T *>( mon_ptr.get() );
4515 }
4516 }
4517 if( !std::is_same<T, npc>::value && !std::is_same<T, const npc>::value ) {
4518 if( p == u.pos() ) {
4519 return dynamic_cast<T *>( &u );
4520 }
4521 }
4522 for( auto &cur_npc : active_npc ) {
4523 if( cur_npc->pos() == p && !cur_npc->is_dead() ) {
4524 return dynamic_cast<T *>( cur_npc.get() );
4525 }
4526 }
4527 return nullptr;
4528}
static const efftype_id effect_ridden("ridden")

References active_npc, critter_tracker, effect_ridden, Character::pos(), and u.

Referenced by draw_look_around_cursor(), examine(), find_or_make_stairs(), fling_creature(), forced_door_closing(), get_player_input(), is_empty(), knockback(), phasing_move(), print_all_tile_info(), spawn_hallucination(), swap_critters(), and update_stair_monsters().

◆ critter_at() [2/2]

template<typename T >
const T * game::critter_at ( const tripoint p,
bool  allow_hallucination = false 
) const

Definition at line 4531 of file game.cpp.

4532{
4533 return const_cast<game *>( this )->critter_at<T>( p, allow_hallucination );
4534}
Definition: game.h:144

◆ critter_by_id()

template<typename T >
template Creature * game::critter_by_id< Creature > ( const character_id id)
Returns
The living creature with the given id. Returns null if no living creature with such an id exists. Never returns a dead creature. Currently only the player character and npcs have ids.

Definition at line 4577 of file game.cpp.

4578{
4579 if( id == u.getID() ) {
4580 // player is always alive, therefore no is-dead check
4581 return dynamic_cast<T *>( &u );
4582 }
4583 return find_npc( id );
4584}
character_id getID() const
Definition: character.cpp:483
npc * find_npc(character_id id)
Find the npc with the given ID.
Definition: game.cpp:1869

References find_npc(), Character::getID(), and u.

◆ death_screen()

void game::death_screen ( )
private

Definition at line 2412 of file game.cpp.

2413{
2414 gamemode->game_over();
2419 follower_ids.clear();
2421}
diary * get_avatar_diary()
Definition: avatar.cpp:369
void death_entry()
Definition: diary.cpp:672
stats_tracker & stats()
Definition: game.cpp:2707
void disp_NPC_epilogues()
Definition: game.cpp:2786
void display_faction_epilogues()
Definition: game.cpp:2803
void display_messages()
Definition: messages.cpp:801
void show_scores_ui(const achievements_tracker &achievements, stats_tracker &stats, const kill_tracker &kills)
Definition: scores_ui.cpp:69

References achievements_tracker_ptr, diary::death_entry(), disp_NPC_epilogues(), display_faction_epilogues(), Messages::display_messages(), follower_ids, gamemode, avatar::get_avatar_diary(), get_kill_tracker(), show_scores_ui(), stats(), and u.

Referenced by cleanup_at_end().

◆ despawn_monster()

void game::despawn_monster ( monster critter)

Despawn a specific monster, it's stored on the overmap.

Also removes it from the creature tracker. Keep in mind that any monster index may point to a different monster after calling this (or to no monster at all).

Definition at line 10973 of file game.cpp.

10974{
10975 if( !critter.is_hallucination() ) {
10976 // hallucinations aren't stored, they come and go as they like,
10978 }
10979
10980 critter.on_unload();
10981 remove_zombie( critter );
10982 // simulate it being dead so further processing of it (e.g. in monmove) will yield
10983 critter.set_hp( 0 );
10984}
void remove_zombie(const monster &critter)
Definition: game.cpp:4688
bool is_hallucination() const override
Definition: monster.cpp:2681
void on_unload()
Do some cleanup and caching as monster is being unloaded from map.
Definition: monster.cpp:3008
void set_hp(int hp)
Directly set the current hp of the monster (not capped at the maximal hp).
Definition: monster.cpp:1664
void despawn_monster(const monster &critter)
Despawn the monster back onto the overmap.

References overmapbuffer::despawn_monster(), monster::is_hallucination(), monster::on_unload(), overmap_buffer, remove_zombie(), and monster::set_hp().

Referenced by cleanup_at_end(), monmove(), place_player_overmap(), and shift_monsters().

◆ disable_robot()

bool game::disable_robot ( const tripoint p)

If there is a robot (that can be disabled), query the player and try to disable it.

Returns
true if the robot has been disabled or a similar action has been done. false if the player did not choose any action and the function has effectively done nothing.

Definition at line 8595 of file game.cpp.

8596{
8597 monster *const mon_ptr = critter_at<monster>( p );
8598 if( !mon_ptr ) {
8599 return false;
8600 }
8601 monster &critter = *mon_ptr;
8602 if( critter.friendly == 0 || critter.has_effect( effect_pet ) ||
8603 critter.has_flag( MF_RIDEABLE_MECH ) ||
8604 ( critter.has_flag( MF_PAY_BOT ) && critter.has_effect( effect_paid ) ) ) {
8605 // Can only disable / reprogram friendly monsters
8606 return false;
8607 }
8608 const auto mid = critter.type->id;
8609 const auto mon_item_id = critter.type->revert_to_itype;
8610 if( !mon_item_id.is_empty() &&
8611 query_yn( _( "Deactivate the %s?" ), critter.name() ) ) {
8612
8613 u.moves -= 100;
8614 m.add_item_or_charges( p, critter.to_item() );
8615 if( !critter.has_flag( MF_INTERIOR_AMMO ) ) {
8616 for( auto &ammodef : critter.ammo ) {
8617 if( ammodef.second > 0 ) {
8618 m.spawn_item( p.xy(), ammodef.first, 1, ammodef.second, calendar::turn );
8619 }
8620 }
8621 }
8622 remove_zombie( critter );
8623 return true;
8624 }
8625 // Manhacks are special, they have their own menu here.
8626 if( mid == mon_manhack ) {
8627 int choice = UILIST_CANCEL;
8628 if( critter.has_effect( effect_docile ) ) {
8629 choice = uilist( _( "Reprogram the manhack?" ), { _( "Engage targets." ) } );
8630 } else {
8631 choice = uilist( _( "Reprogram the manhack?" ), { _( "Follow me." ) } );
8632 }
8633 switch( choice ) {
8634 case 0:
8635 if( critter.has_effect( effect_docile ) ) {
8636 critter.remove_effect( effect_docile );
8637 if( one_in( 3 ) ) {
8638 add_msg( _( "The %s hovers momentarily as it surveys the area." ),
8639 critter.name() );
8640 }
8641 } else {
8642 critter.add_effect( effect_docile, 1_turns, num_bp );
8643 if( one_in( 3 ) ) {
8644 add_msg( _( "The %s lets out a whirring noise and starts to follow you." ),
8645 critter.name() );
8646 }
8647 }
8648 u.moves -= 100;
8649 return true;
8650 default:
8651 break;
8652 }
8653 }
8654 return false;
8655}
@ num_bp
Definition: bodypart.h:52
bool remove_effect(const efftype_id &eff_id, body_part bp=num_bp)
Removes a listed effect.
Definition: creature.cpp:1142
void spawn_item(const tripoint &p, const itype_id &type_id, unsigned quantity=1, int charges=0, const time_point &birthday=calendar::start_of_cataclysm, int damlevel=0)
Definition: map.cpp:4253
bool has_flag(m_flag f) const override
Definition: monster.cpp:898
item to_item() const
Convert this monster into an item (see mtype::revert_to_itype).
Definition: monster.cpp:2821
void add_effect(const efftype_id &eff_id, const time_duration &dur, const bodypart_str_id &bp, int intensity=0, bool force=false, bool deferred=false) override
Performs any monster-specific modifications to the arguments before passing to Creature::add_effect()...
Definition: monster.cpp:1840
int friendly
Definition: monster.h:470
std::string name(unsigned int quantity=1) const
Definition: monster.cpp:493
std::map< itype_id, int > ammo
Definition: monster.h:511
static const efftype_id effect_pet("pet")
static const efftype_id effect_docile("docile")
static const efftype_id effect_paid("paid")
static const mtype_id mon_manhack("mon_manhack")
@ MF_INTERIOR_AMMO
Definition: mtype.h:146
@ MF_RIDEABLE_MECH
Definition: mtype.h:115
@ MF_PAY_BOT
Definition: mtype.h:121
itype_id revert_to_itype
If this is not empty, the monster can be converted into an item of this type (if it's friendly).
Definition: mtype.h:364
constexpr point xy() const
Definition: point.h:206
const int UILIST_CANCEL
Definition: ui.h:28

References _, monster::add_effect(), map::add_item_or_charges(), add_msg(), monster::ammo, effect_docile, effect_paid, effect_pet, monster::friendly, Creature::has_effect(), monster::has_flag(), mtype::id, m, MF_INTERIOR_AMMO, MF_PAY_BOT, MF_RIDEABLE_MECH, mon_manhack, Creature::moves, monster::name(), num_bp, one_in(), query_yn(), Creature::remove_effect(), remove_zombie(), mtype::revert_to_itype, map::spawn_item(), monster::to_item(), calendar::turn, monster::type, u, UILIST_CANCEL, and tripoint::xy().

Referenced by examine().

◆ disp_NPC_epilogues()

void game::disp_NPC_epilogues ( )
private

Definition at line 2786 of file game.cpp.

2787{
2788 // TODO: This search needs to be expanded to all NPCs
2789 for( auto elem : follower_ids ) {
2791 if( !guy ) {
2792 continue;
2793 }
2794 const auto new_win = []() {
2796 point( std::max( 0, ( TERMX - FULL_SCREEN_WIDTH ) / 2 ),
2797 std::max( 0, ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) ) );
2798 };
2799 scrollable_text( new_win, guy->disp_name(), guy->get_epilogue() );
2800 }
2801}
shared_ptr_fast< npc > find_npc(character_id id)
Find the npc with the given ID.
void scrollable_text(const std::function< catacurses::window()> &init_window, const std::string &title, const std::string &text)
Definition: output.cpp:352

References overmapbuffer::find_npc(), follower_ids, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, catacurses::newwin(), overmap_buffer, scrollable_text(), TERMX, and TERMY.

Referenced by death_screen().

◆ disp_NPCs()

void game::disp_NPCs ( )

Definition at line 2837 of file game.cpp.

2838{
2839 const tripoint_abs_omt ppos = u.global_omt_location();
2840 const tripoint &lpos = u.pos();
2841 std::vector<shared_ptr_fast<npc>> npcs = overmap_buffer.get_npcs_near_player( 100 );
2842 std::sort( npcs.begin(), npcs.end(), npc_dist_to_player() );
2843
2845 ui_adaptor ui;
2846 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
2849 TERMY > FULL_SCREEN_HEIGHT ? ( TERMY - FULL_SCREEN_HEIGHT ) / 2 : 0 ) );
2850 ui.position_from_window( w );
2851 } );
2852 ui.mark_resize();
2853 ui.on_redraw( [&]( const ui_adaptor & ) {
2854 werase( w );
2855 mvwprintz( w, point_zero, c_white, _( "Your overmap position: %s" ), ppos.to_string() );
2856 // NOLINTNEXTLINE(cata-use-named-point-constants)
2857 mvwprintz( w, point( 0, 1 ), c_white, _( "Your local position: %s" ), lpos.to_string() );
2858 size_t i;
2859 for( i = 0; i < 20 && i < npcs.size(); i++ ) {
2860 const tripoint_abs_omt apos = npcs[i]->global_omt_location();
2861 mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %s", npcs[i]->name,
2862 apos.to_string() );
2863 }
2864 for( const monster &m : all_monsters() ) {
2865 mvwprintz( w, point( 0, i + 3 ), c_white, "%s: %d, %d, %d", m.name(),
2866 m.posx(), m.posy(), m.posz() );
2867 ++i;
2868 }
2869 wnoutrefresh( w );
2870 } );
2871
2872 input_context ctxt( "DISP_NPCS" );
2873 ctxt.register_action( "CONFIRM" );
2874 ctxt.register_action( "QUIT" );
2875 ctxt.register_action( "HELP_KEYBINDINGS" );
2876 bool stop = false;
2877 while( !stop ) {
2879 const std::string action = ctxt.handle_input();
2880 if( action == "CONFIRM" || action == "QUIT" ) {
2881 stop = true;
2882 }
2883 }
2884}
tripoint_abs_omt global_omt_location() const
Returns the location of the player in global overmap terrain coordinates.
Definition: character.cpp:6231
std::string to_string() const
Definition: coordinates.h:140
Represents a context in which a set of actions can be performed.
Definition: input.h:386
std::string name(const tripoint &p)
Definition: map.cpp:1383
void wnoutrefresh(const window &win)
Definition: ncurses_def.cpp:43
void werase(const window &win)
Definition: ncurses_def.cpp:53
std::string to_string() const
Definition: point.cpp:34

References _, action, all_monsters(), c_white, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, overmapbuffer::get_npcs_near_player(), Character::global_omt_location(), input_context::handle_input(), m, mvwprintz(), map::name(), om_direction::name(), catacurses::newwin(), overmap_buffer, point_zero, Character::pos(), ui_manager::redraw(), input_context::register_action(), TERMX, TERMY, coords::coord_point< Point, Origin, Scale >::to_string(), tripoint::to_string(), u, catacurses::werase(), and catacurses::wnoutrefresh().

◆ display_faction_epilogues()

void game::display_faction_epilogues ( )
private

Definition at line 2803 of file game.cpp.

2804{
2805 for( const auto &elem : faction_manager_ptr->all() ) {
2806 if( elem.second.known_by_u ) {
2807 const std::vector<std::string> epilogue = elem.second.epilogue();
2808 if( !epilogue.empty() ) {
2809 const auto new_win = []() {
2811 point( std::max( 0, ( TERMX - FULL_SCREEN_WIDTH ) / 2 ),
2812 std::max( 0, ( TERMY - FULL_SCREEN_HEIGHT ) / 2 ) ) );
2813 };
2814 scrollable_text( new_win, elem.second.name,
2815 std::accumulate( epilogue.begin() + 1, epilogue.end(), epilogue.front(),
2816 []( const std::string & lhs, const std::string & rhs ) -> std::string {
2817 return lhs + "\n" + rhs;
2818 } ) );
2819 }
2820 }
2821 }
2822}
pimpl< faction_manager > faction_manager_ptr
Definition: game.h:974

References faction_manager_ptr, FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, catacurses::newwin(), scrollable_text(), TERMX, and TERMY.

Referenced by death_screen().

◆ display_lighting()

void game::display_lighting ( )
private

Definition at line 11184 of file game.cpp.

11185{
11186 if( use_tiles ) {
11188 if( !g->display_overlay_state( ACTION_DISPLAY_LIGHTING ) ) {
11189 return;
11190 }
11191 uilist lighting_menu;
11192 std::vector<std::string> lighting_menu_strings{
11193 "Global lighting conditions"
11194 };
11195
11196 int count = 0;
11197 for( const auto &menu_str : lighting_menu_strings ) {
11198 lighting_menu.addentry( count++, true, MENU_AUTOASSIGN, "%s", menu_str );
11199 }
11200
11201 lighting_menu.w_y_setup = 0;
11202 lighting_menu.query();
11203 if( ( lighting_menu.ret >= 0 ) &&
11204 ( static_cast<size_t>( lighting_menu.ret ) < lighting_menu_strings.size() ) ) {
11205 g->displaying_lighting_condition = lighting_menu.ret;
11206 }
11207 }
11208}
@ ACTION_DISPLAY_LIGHTING
Toggle lighting conditions map.
Definition: action.h:321
bool use_tiles
Use tiles for display.
void display_toggle_overlay(action_id)
Definition: game.cpp:11080
pos_scalar w_y_setup
Definition: ui.h:338
constexpr size_t count()
Definition: fmtlib_core.h:1073
const int MENU_AUTOASSIGN
Definition: ui.h:31

References ACTION_DISPLAY_LIGHTING, uilist::addentry(), detail::count(), display_toggle_overlay(), g, MENU_AUTOASSIGN, uilist::query(), uilist::ret, use_tiles, and uilist::w_y_setup.

Referenced by handle_action(), and look_around().

◆ display_overlay_state()

bool game::display_overlay_state ( action_id  action)

Definition at line 11075 of file game.cpp.

11076{
11078}
cata::optional< action_id > displaying_overlays
Definition: game.h:919

References action, and displaying_overlays.

Referenced by display_toggle_overlay(), and display_visibility().

◆ display_radiation()

void game::display_radiation ( )
private

Definition at line 11210 of file game.cpp.

11211{
11212 if( use_tiles ) {
11214 }
11215}
@ ACTION_DISPLAY_RADIATION
Toggle radiation map.
Definition: action.h:323

References ACTION_DISPLAY_RADIATION, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_scent()

void game::display_scent ( )
private

Definition at line 11089 of file game.cpp.

11090{
11091 if( use_tiles ) {
11093 } else {
11094 int div;
11095 bool got_value = query_int( div, _( "Set the Scent Map sensitivity to (0 to cancel)?" ) );
11096 if( !got_value || div < 1 ) {
11097 add_msg( _( "Never mind." ) );
11098 return;
11099 }
11100 shared_ptr_fast<game::draw_callback_t> scent_cb = make_shared_fast<game::draw_callback_t>( [&]() {
11101 scent.draw( w_terrain, div * 2, u.pos() + u.view_offset );
11102 } );
11103 g->add_draw_callback( scent_cb );
11104
11107 }
11108}
@ ACTION_DISPLAY_SCENT
Toggle scent map.
Definition: action.h:283
void wait_for_any_key()
Wait until the user presses a key.
Definition: input.cpp:1309
tripoint view_offset
Definition: player.h:233
void draw(const catacurses::window &win, int div, const tripoint &center) const
Definition: scent_map.cpp:70
input_manager inp_mngr
Definition: input.cpp:109
bool query_int(int &result, int default_val, const std::string &text)
Definition: output.cpp:718

References _, ACTION_DISPLAY_SCENT, add_msg(), display_toggle_overlay(), scent_map::draw(), g, inp_mngr, Character::pos(), query_int(), ui_manager::redraw(), scent, u, use_tiles, player::view_offset, w_terrain, and input_manager::wait_for_any_key().

Referenced by handle_action(), and look_around().

◆ display_temperature()

void game::display_temperature ( )
private

Definition at line 11110 of file game.cpp.

11111{
11112 if( use_tiles ) {
11114 }
11115}
@ ACTION_DISPLAY_TEMPERATURE
Toggle temperature map.
Definition: action.h:315

References ACTION_DISPLAY_TEMPERATURE, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_toggle_overlay()

void game::display_toggle_overlay ( action_id  action)

Definition at line 11080 of file game.cpp.

11081{
11082 if( display_overlay_state( action ) ) {
11083 displaying_overlays.reset();
11084 } else {
11086 }
11087}
bool display_overlay_state(action_id)
Definition: game.cpp:11075

References action, display_overlay_state(), and displaying_overlays.

Referenced by display_lighting(), display_radiation(), display_scent(), display_temperature(), display_transparency(), display_vehicle_ai(), and display_visibility().

◆ display_transparency()

void game::display_transparency ( )
private

Definition at line 11217 of file game.cpp.

11218{
11219 if( use_tiles ) {
11221 }
11222}
@ ACTION_DISPLAY_TRANSPARENCY
Toggle transparency map.
Definition: action.h:325

References ACTION_DISPLAY_TRANSPARENCY, display_toggle_overlay(), and use_tiles.

Referenced by handle_action(), and look_around().

◆ display_vehicle_ai()

void game::display_vehicle_ai ( )
private

Definition at line 11117 of file game.cpp.

11118{
11119 if( use_tiles ) {
11121 }
11122}
@ ACTION_DISPLAY_VEHICLE_AI
Toggle vehicle autopilot data.
Definition: action.h:317

References ACTION_DISPLAY_VEHICLE_AI, display_toggle_overlay(), and use_tiles.

Referenced by handle_action().

◆ display_visibility()

void game::display_visibility ( )
private

Definition at line 11124 of file game.cpp.

11125{
11126 if( use_tiles ) {
11129 std::vector< tripoint > locations;
11130 uilist creature_menu;
11131 int num_creatures = 0;
11132 creature_menu.addentry( num_creatures++, true, MENU_AUTOASSIGN, "%s", _( "You" ) );
11133 locations.emplace_back( g->u.pos() ); // add player first.
11134 for( const Creature &critter : g->all_creatures() ) {
11135 if( critter.is_player() ) {
11136 continue;
11137 }
11138 creature_menu.addentry( num_creatures++, true, MENU_AUTOASSIGN, critter.disp_name() );
11139 locations.emplace_back( critter.pos() );
11140 }
11141
11142 pointmenu_cb callback( locations );
11143 creature_menu.callback = &callback;
11144 creature_menu.w_y_setup = 0;
11145 creature_menu.query();
11146 if( creature_menu.ret >= 0 && static_cast<size_t>( creature_menu.ret ) < locations.size() ) {
11147 Creature *creature = critter_at<Creature>( locations[creature_menu.ret] );
11149 }
11150 } else {
11152 }
11153 }
11154}
@ ACTION_DISPLAY_VISIBILITY
Toggle visibility map.
Definition: action.h:319
size_t num_creatures() const
Returns the approximate number of creatures in the reality bubble.
Definition: game.cpp:4678
Creature * displaying_visibility_creature
Creature for which to display the visibility map.
Definition: game.h:1010
Callback for uilist that pairs menu entries with points When an entry is selected,...
Definition: ui.h:423
uilist_callback * callback
Definition: ui.h:335
generic_factory< overmap_location > locations("overmap location")

References _, ACTION_DISPLAY_VISIBILITY, uilist::addentry(), uilist::callback, creature, display_overlay_state(), display_toggle_overlay(), displaying_visibility_creature, g, anonymous_namespace{overmap_location.cpp}::locations, MENU_AUTOASSIGN, num_creatures(), uilist::query(), uilist::ret, use_tiles, and uilist::w_y_setup.

Referenced by handle_action().

◆ do_turn()

bool game::do_turn ( )

MAIN GAME LOOP.

Returns true if game is over (death, saved, quit, etc.).

Definition at line 1343 of file game.cpp.

1344{
1345 if( is_game_over() ) {
1346 return cleanup_at_end();
1347 }
1348 // Actual stuff
1349 if( new_game ) {
1350 new_game = false;
1351 } else {
1352 gamemode->per_turn();
1353 calendar::turn += 1_turns;
1354 }
1355
1356 // starting a new turn, clear out temperature cache
1358 weather.clear_temp_cache();
1359
1360 if( npcs_dirty ) {
1361 load_npcs();
1362 }
1363
1366 // If controlling a vehicle that is owned by someone else
1368 vehicle *veh = veh_pointer_or_null( m.veh_at( u.pos() ) );
1369 if( veh && !veh->handle_potential_theft( u, true ) ) {
1370 veh->handle_potential_theft( u, false, false );
1371 }
1372 }
1373 // If riding a horse - chance to spook
1374 if( u.is_mounted() ) {
1376 }
1377 if( calendar::once_every( 1_days ) ) {
1379 }
1380
1381 // Move hordes every 2.5 min
1384 // Hordes that reached the reality bubble need to spawn,
1385 // make them spawn in invisible areas only.
1386 m.spawn_monsters( false );
1387 }
1388
1390
1391 u.update_body();
1392
1393 // Auto-save if autosave is enabled
1394 if( get_option<bool>( "AUTOSAVE" ) &&
1395 calendar::once_every( 1_turns * get_option<int>( "AUTOSAVE_TURNS" ) ) &&
1396 !u.is_dead_state() ) {
1397 autosave();
1398 }
1399
1400 weather.update_weather();
1402
1406 // Process NPC sound events before they move or they hear themselves talking
1407 for( npc &guy : all_npcs() ) {
1408 if( rl_dist( guy.pos(), u.pos() ) < MAX_VIEW_DISTANCE ) {
1410 }
1411 }
1412
1413 // Process sound events into sound markers for display to the player.
1415
1416 if( u.is_deaf() ) {
1418 }
1419
1420 if( !u.has_effect( effect_sleep ) || uquit == QUIT_WATCH ) {
1421 if( u.moves > 0 || uquit == QUIT_WATCH ) {
1422 while( u.moves > 0 || uquit == QUIT_WATCH ) {
1423 cleanup_dead();
1425 // Process any new sounds the player caused during their turn.
1426 for( npc &guy : all_npcs() ) {
1427 if( rl_dist( guy.pos(), u.pos() ) < MAX_VIEW_DISTANCE ) {
1429 }
1430 }
1433 wait_popup.reset();
1435 }
1436
1437 if( queue_screenshot ) {
1441 queue_screenshot = false;
1442 }
1443
1444 if( handle_action() ) {
1446 u.action_taken();
1447 }
1448
1449 if( is_game_over() ) {
1450 return cleanup_at_end();
1451 }
1452
1453 if( uquit == QUIT_WATCH ) {
1454 break;
1455 }
1456 if( u.activity ) {
1458 }
1459 }
1460 // Reset displayed sound markers now that the turn is over.
1461 // We only want this to happen if the player had a chance to examine the sounds.
1463 }
1464 }
1465
1466 if( driving_view_offset.x != 0 || driving_view_offset.y != 0 ) {
1467 // Still have a view offset, but might not be driving anymore,
1468 // or the option has been deactivated,
1469 // might also happen when someone dives from a moving car.
1470 // or when using the handbrake.
1471 vehicle *veh = veh_pointer_or_null( m.veh_at( u.pos() ) );
1472 calc_driving_offset( veh );
1473 }
1474
1475 // No-scent debug mutation has to be processed here or else it takes time to start working
1476 if( !u.has_active_bionic( bionic_id( "bio_scent_mask" ) ) &&
1477 !u.has_trait( trait_id( "DEBUG_NOSCENT" ) ) ) {
1480 }
1481 scent.update( u.pos(), m );
1482
1483 // We need floor cache before checking falling 'n stuff
1485
1488 m.vehmove();
1489 m.process_fields();
1490 m.process_items();
1493
1494 // Apply sounds from previous turn to monster and NPC AI.
1496 // Update vision caches for monsters. If this turns out to be expensive,
1497 // consider a stripped down cache just for monsters.
1498 m.build_map_cache( get_levz(), true );
1499 monmove();
1500 if( calendar::once_every( 5_minutes ) ) {
1502 }
1503 if( calendar::once_every( 10_seconds ) ) {
1504 for( const tripoint &elem : m.get_furn_field_locations() ) {
1505 const auto &furn = m.furn( elem ).obj();
1506 for( const emit_id &e : furn.emissions ) {
1507 m.emit_field( elem, e );
1508 }
1509 }
1510 }
1513 u.process_turn();
1514
1516 cleanup_dead();
1517
1518 if( u.moves < 0 && get_option<bool>( "FORCE_REDRAW" ) ) {
1521 }
1522
1523 if( get_levz() >= 0 && !u.is_underwater() ) {
1524 handle_weather_effects( weather.weather_id );
1525 }
1526
1527 const bool player_is_sleeping = u.has_effect( effect_sleep );
1528 bool wait_redraw = false;
1529 std::string wait_message;
1530 time_duration wait_refresh_rate;
1531 if( player_is_sleeping ) {
1532 wait_redraw = true;
1533 wait_message = _( "Wait till you wake up…" );
1534 wait_refresh_rate = 30_minutes;
1535 if( calendar::once_every( 1_hours ) ) {
1537 }
1538 } else if( u.has_destination() ) {
1539 wait_redraw = true;
1540 wait_message = _( "Travelling…" );
1541 wait_refresh_rate = 15_turns;
1542 } else if( const cata::optional<std::string> progress = u.activity.get_progress_message( u ) ) {
1543 wait_redraw = true;
1544 wait_message = *progress;
1545 if( u.activity.id() == ACT_AUTODRIVE ) {
1546 wait_refresh_rate = 1_turns;
1547 } else {
1548 wait_refresh_rate = 5_minutes;
1549 }
1550 }
1551 if( wait_redraw ) {
1553 calendar::once_every( std::min( 1_minutes, wait_refresh_rate ) ) ) {
1554 if( first_redraw_since_waiting_started || calendar::once_every( wait_refresh_rate ) ) {
1556 }
1557
1558 // Avoid redrawing the main UI every time due to invalidation
1560 wait_popup = std::make_unique<static_popup>();
1561 wait_popup->on_top( true ).wait_message( "%s", wait_message );
1565 }
1566 } else {
1567 // Nothing to wait for now
1568 wait_popup.reset();
1570 }
1571
1574 u.apply_wetness_morale( weather.temperature );
1575
1576 if( calendar::once_every( 1_minutes ) ) {
1577 u.update_morale();
1578 }
1579
1580 if( calendar::once_every( 9_turns ) ) {
1582 }
1583
1584 if( !u.is_deaf() ) {
1586 }
1591
1592 // reset player noise
1593 u.volume = 0;
1594
1595 return false;
1596}
void update_morale()
Ticks down morale counters and removes them.
Definition: character.cpp:8956
void action_taken()
Called after every action, invalidates player caches.
Definition: character.cpp:798
bool check_mount_is_spooked()
Definition: character.cpp:1023
void process_turn() override
Handles end-of-turn processing.
void update_bodytemp(const map &m, const weather_manager &weather)
Maintains body temperature.
Definition: character.cpp:5179
bool is_mounted() const
Definition: character.cpp:1064
bool has_destination() const
scenttype_id get_type_of_scent() const
Definition: character.cpp:8715
bool is_dead_state() const override
Returns true if the character should be dead.
Definition: character.cpp:488
bool check_and_recover_morale()
Checks permanent morale for consistency and recovers it when an inconsistency is found.
Definition: character.cpp:9083
bool is_deaf() const
Definition: character.cpp:4474
void update_body()
Updates all "biology" by one turn.
Definition: character.cpp:4653
bool has_active_bionic(const bionic_id &b) const
Returns true if the player has the entered bionic id and it is powered on.
Definition: character.cpp:1805
void apply_wetness_morale(int temperature)
Recalculates morale penalty/bonus from wetness based on mutations, equipment and temperature.
Definition: suffer.cpp:1809
virtual bool is_underwater() const
Definition: creature.cpp:170
int get_levz() const
Definition: game.cpp:11844
void overmap_npc_move()
Definition: game.cpp:4177
class game::debug_hour_timer debug_hour_timer
npc_range all_npcs()
Same as all_creatures but iterators only over npcs.
Definition: game.cpp:11954
void monmove()
Definition: game.cpp:4051
void autopilot_vehicles()
process vehicles that are following the player
Definition: game.cpp:1661
void add_artifact_dreams()
Definition: game.cpp:11786
int moves_since_last_save
Definition: game.h:1040
bool take_screenshot() const
Saves a screenshot of the current viewport, as a PNG file.
Definition: game.cpp:7114
void calc_driving_offset(vehicle *veh=nullptr)
Definition: game.cpp:1241
bool cleanup_at_end()
Definition: game.cpp:937
std::unique_ptr< static_popup > wait_popup
Definition: game.h:1076
bool queue_screenshot
Definition: game.h:1019
friend weather_manager & get_weather()
Definition: weather.cpp:64
void autosave()
Definition: game.cpp:11275
void process_activity()
Definition: game.cpp:1650
void update_stair_monsters()
Definition: game.cpp:10764
void process_voluntary_act_interrupt()
Definition: game.cpp:1610
void load_npcs()
Makes any nearby NPCs on the overmap active.
Definition: game.cpp:806
bool npcs_dirty
Has a NPC been spawned since last load?
Definition: game.h:1047
void cleanup_dead()
Definition: game.cpp:4016
bool is_game_over()
Definition: game.cpp:2365
void perhaps_add_random_npc()
Definition: game.cpp:11011
void mon_info_update()
Definition: game.cpp:3815
bool handle_action()
const T & obj() const
Definition: ammo_effect.cpp:26
void build_floor_caches()
Definition: map.cpp:8124
void process_falling()
Invoked drop_everything on cached dirty tiles.
Definition: map.cpp:2332
void emit_field(const tripoint &pos, const emit_id &src, float mul=1.0f)
Runs one cycle of emission src which may result in propagation of fields.
Definition: map_field.cpp:1928
const std::vector< tripoint > & get_furn_field_locations() const
Definition: map.cpp:7821
void spawn_monsters(bool ignore_sight)
Spawn monsters from submap spawn points and from the overmap.
Definition: map.cpp:7780
void vehmove()
Definition: map.cpp:472
void creature_in_field(Creature &critter)
Apply field effects to the creature when it's on a square with fields.
Definition: map_field.cpp:1563
void process_fields()
Definition: map_field.cpp:141
furn_id furn(const tripoint &p) const
Definition: map.cpp:1406
void build_map_cache(int zlev, bool skip_lightmap=false)
Definition: map.cpp:8290
void process_items()
Definition: map.cpp:4639
static void process_all()
Handles mission deadline processing.
Definition: mission.cpp:98
void set_scent(const tripoint_abs_omt &loc, int strength)
Method to set a scent trace.
void process_mongroups()
Process nearby monstergroups (dying mostly).
void move_hordes()
Let hordes move a step.
const activity_id & id() const
cata::optional< std::string > get_progress_message(const avatar &u) const
Helper that returns an activity specific progress message.
int volume
Definition: player.h:236
int scent
Definition: player.h:245
void set(const tripoint &p, int value, const scenttype_id &type=scenttype_id())
Get the scent value at the given position.
Definition: scent_map.cpp:102
void update(const tripoint &center, map &m)
Definition: scent_map.cpp:150
static constexpr time_duration from_minutes(const T m)
Definition: calendar.h:212
void process()
Process all queued events, potentially altering the game state and modifying the event queue.
static const activity_id ACT_AUTODRIVE("ACT_AUTODRIVE")
static const efftype_id effect_sleep("sleep")
@ QUIT_WATCH
Definition: game.h:73
static constexpr int MAX_VIEW_DISTANCE
void handle_weather_effects(const weather_type_id &w)
Definition: weather.cpp:522
bool once_every(const time_duration &event_frequency)
Predicate to handle rate-limiting.
Definition: calendar.cpp:490
void update_body_wetness(Character &who, const w_point &weather)
Maintains body wetness and handles the rate at which the player dries.
explosion_queue & get_explosion_queue()
Definition: explosion.cpp:1261
void do_vehicle_engine_sfx()
Definition: sounds.cpp:1612
void do_hearing_loss(int turns=-1)
Definition: sounds.cpp:1607
void do_danger_music()
Definition: sounds.cpp:1611
void do_vehicle_exterior_engine_sfx()
Definition: sounds.cpp:1613
void do_fatigue()
Definition: sounds.cpp:1632
void remove_hearing_loss()
Definition: sounds.cpp:1608
void process_sound_markers(player *p)
Definition: sounds.cpp:386
void process_sounds()
Definition: sounds.cpp:304
void reset_markers()
Definition: sounds.cpp:572
vehicle * veh_pointer_or_null(const optional_vpart_position &p)

References _, ACT_AUTODRIVE, Character::action_taken(), Character::activity, add_artifact_dreams(), all_npcs(), Character::apply_wetness_morale(), autopilot_vehicles(), autosave(), map::build_floor_caches(), map::build_map_cache(), calc_driving_offset(), Character::check_and_recover_morale(), Character::check_mount_is_spooked(), cleanup_at_end(), cleanup_dead(), Character::controlling_vehicle, map::creature_in_field(), sfx::do_danger_music(), sfx::do_fatigue(), sfx::do_hearing_loss(), sfx::do_vehicle_engine_sfx(), sfx::do_vehicle_exterior_engine_sfx(), driving_view_offset, effect_sleep, map::emit_field(), explosion_handler::explosion_queue::execute(), first_redraw_since_waiting_started, time_duration::from_minutes(), map::furn(), gamemode, explosion_handler::get_explosion_queue(), map::get_furn_field_locations(), get_levz(), player_activity::get_progress_message(), Character::get_type_of_scent(), get_weather, Character::global_omt_location(), grid_tracker_ptr, handle_action(), vehicle::handle_potential_theft(), handle_weather_effects(), Character::has_active_bionic(), Character::has_destination(), Character::has_distant_destination(), Creature::has_effect(), Character::has_trait(), player_activity::id(), Character::in_vehicle, invalidate_main_ui_adaptor(), Character::is_dead_state(), Character::is_deaf(), is_game_over(), Character::is_mounted(), Creature::is_underwater(), load_npcs(), m, MAX_VIEW_DISTANCE, mon_info_update(), monmove(), overmapbuffer::move_hordes(), Creature::moves, moves_since_last_save, new_game, npcs_dirty, int_id< T >::obj(), calendar::once_every(), overmap_buffer, overmap_npc_move(), perhaps_add_random_npc(), Character::pos(), game::debug_hour_timer::print_time(), timed_event_manager::process(), process_activity(), mission::process_all(), map::process_falling(), map::process_fields(), map::process_items(), overmapbuffer::process_mongroups(), sounds::process_sound_markers(), sounds::process_sounds(), Character::process_turn(), process_voluntary_act_interrupt(), queue_screenshot, QUIT_WATCH, ui_manager::redraw(), refresh_display(), sfx::remove_hearing_loss(), reset_light_level(), sounds::reset_markers(), rl_dist(), scent, player::scent, scent_map::set(), overmapbuffer::set_scent(), map::spawn_monsters(), take_screenshot(), timed_events, calendar::turn, u, scent_map::update(), Character::update_body(), character_funcs::update_body_wetness(), Character::update_bodytemp(), Character::update_morale(), update_stair_monsters(), uquit, map::veh_at(), veh_pointer_or_null(), map::vehmove(), player::volume, wait_popup, point::x, and point::y.

◆ draw()

void game::draw ( )

Definition at line 3074 of file game.cpp.

3075{
3076 if( test_mode ) {
3077 return;
3078 }
3079
3080 //temporary fix for updating visibility for minimap
3081 ter_view_p.z = ( u.pos() + u.view_offset ).z;
3084
3085 werase( w_terrain );
3086 draw_ter();
3087 for( auto it = draw_callbacks.begin(); it != draw_callbacks.end(); ) {
3088 shared_ptr_fast<draw_callback_t> cb = it->lock();
3089 if( cb ) {
3090 ( *cb )();
3091 ++it;
3092 } else {
3093 it = draw_callbacks.erase( it );
3094 }
3095 }
3097
3098 draw_panels( true );
3099}
bool test_mode
Set to true when running in test mode (e.g.
tripoint ter_view_p
Definition: game.h:986
void draw_panels(bool force_draw=false)
Definition: game.cpp:3101
void draw_ter(bool draw_sounds=true)
Definition: game.cpp:3215
void update_visibility_cache(int zlev)
Definition: map.cpp:5669
int z
Definition: point.h:138

References map::build_map_cache(), draw_callbacks, draw_panels(), draw_ter(), m, Character::pos(), ter_view_p, test_mode, u, map::update_visibility_cache(), player::view_offset, w_terrain, catacurses::werase(), catacurses::wnoutrefresh(), and tripoint::z.

◆ draw_below_override()

void game::draw_below_override ( const tripoint p,
bool  draw 
)

Definition at line 963 of file animation.cpp.

964{
965}

◆ draw_bullet()

void game::draw_bullet ( const tripoint t,
int  i,
const std::vector< tripoint > &  trajectory,
char  bullet 
)

Definition at line 518 of file animation.cpp.

520{
521 draw_bullet_curses( m, t, bullet, &trajectory[i] );
522}
void draw_bullet_curses(map &m, const tripoint &t, const char bullet, const tripoint *const p)
Definition: animation.cpp:459
std::vector< tripoint > trajectory
Definition: ranged.h:36

References anonymous_namespace{animation.cpp}::draw_bullet_curses(), and m.

◆ draw_critter()

void game::draw_critter ( const Creature critter,
const tripoint center 
)

Definition at line 3197 of file game.cpp.

3198{
3199 draw_critter_internal( w_terrain, critter, center, false, m, u );
3200}
static void draw_critter_internal(const catacurses::window &w, const Creature &critter, const tripoint &center, bool inverted, const map &m, const avatar &u)
Definition: game.cpp:3164

References center, draw_critter_internal(), m, u, and w_terrain.

Referenced by draw_ter().

◆ draw_critter_highlighted()

void game::draw_critter_highlighted ( const Creature critter,
const tripoint center 
)

Definition at line 3202 of file game.cpp.

3203{
3204 draw_critter_internal( w_terrain, critter, center, true, m, u );
3205}

References center, draw_critter_internal(), m, u, and w_terrain.

◆ draw_cursor()

void game::draw_cursor ( const tripoint p)

Definition at line 724 of file animation.cpp.

725{
726 const tripoint rp = relative_view_pos( *this, p );
727 mvwputch_inv( w_terrain, rp.xy(), c_light_green, 'X' );
728}
#define c_light_green
Definition: color.h:28
tripoint relative_view_pos(const game &g, const tripoint &p) noexcept
Definition: animation.cpp:127
void mvwputch_inv(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:491

References c_light_green, mvwputch_inv(), anonymous_namespace{animation.cpp}::relative_view_pos(), w_terrain, and tripoint::xy().

Referenced by draw_look_around_cursor().

◆ draw_field_override()

void game::draw_field_override ( const tripoint p,
const field_type_id id 
)

Definition at line 919 of file animation.cpp.

920{
921}

◆ draw_furniture_override()

void game::draw_furniture_override ( const tripoint p,
const furn_id id 
)

Definition at line 880 of file animation.cpp.

881{
882}

◆ draw_graffiti_override()

void game::draw_graffiti_override ( const tripoint p,
bool  has 
)

Definition at line 893 of file animation.cpp.

894{
895}

◆ draw_highlight()

void game::draw_highlight ( const tripoint p)

Definition at line 737 of file animation.cpp.

738{
739 // Do nothing
740}

◆ draw_hit_mon()

void game::draw_hit_mon ( const tripoint p,
const monster m,
bool  dead = false 
)

Definition at line 581 of file animation.cpp.

582{
583 draw_hit_mon_curses( p, m, u, dead );
584}
void draw_hit_mon_curses(const tripoint &center, const monster &m, const player &u, const bool dead)
Definition: animation.cpp:552

References dead, anonymous_namespace{animation.cpp}::draw_hit_mon_curses(), m, and u.

◆ draw_hit_player()

void game::draw_hit_player ( const Character p,
int  dam 
)

Definition at line 626 of file animation.cpp.

627{
628 draw_hit_player_curses( *this, p, dam );
629}
void draw_hit_player_curses(const game &g, const Character &p, const int dam)
Definition: animation.cpp:589

References anonymous_namespace{animation.cpp}::draw_hit_player_curses().

◆ draw_item_override()

void game::draw_item_override ( const tripoint p,
const itype_id id,
const mtype_id mid,
bool  hilite 
)

Definition at line 933 of file animation.cpp.

935{
936}

◆ draw_line() [1/2]

void game::draw_line ( const tripoint p,
const std::vector< tripoint > &  points 
)

Definition at line 710 of file animation.cpp.

711{
712 draw_line_curses( *this, points );
713}
void draw_line_curses(game &g, const std::vector< tripoint > &points)
Definition: animation.cpp:690

References anonymous_namespace{animation.cpp}::draw_line_curses().

◆ draw_line() [2/2]

void game::draw_line ( const tripoint p,
const tripoint center_point,
const std::vector< tripoint > &  points,
bool  noreveal = false 
)

Definition at line 677 of file animation.cpp.

679{
680 if( !u.sees( p ) ) {
681 return;
682 }
683
684 draw_line_curses( *this, center, points, noreveal );
685}

References center, anonymous_namespace{animation.cpp}::draw_line_curses(), Character::sees(), and u.

Referenced by draw_ter().

◆ draw_look_around_cursor()

void game::draw_look_around_cursor ( const tripoint lp,
const visibility_variables cache 
)

Definition at line 5646 of file game.cpp.

5647{
5648 if( !liveview.is_enabled() ) {
5649#if defined( TILES )
5650 if( is_draw_tiles_mode() ) {
5651 draw_cursor( lp );
5652 return;
5653 }
5654#endif
5655 const tripoint view_center = u.pos() + u.view_offset;
5656 visibility_type visibility = VIS_HIDDEN;
5657 const bool inbounds = m.inbounds( lp );
5658 if( inbounds ) {
5659 visibility = m.get_visibility( m.apparent_light_at( lp, cache ), cache );
5660 }
5661 if( visibility == VIS_CLEAR ) {
5662 const Creature *const creature = critter_at( lp, true );
5663 if( creature != nullptr && u.sees( *creature ) ) {
5664 creature->draw( w_terrain, view_center, true );
5665 } else {
5666 m.drawsq( w_terrain, lp, drawsq_params().highlight( true ).center( view_center ) );
5667 }
5668 } else {
5669 std::string visibility_indicator;
5670 nc_color visibility_indicator_color = c_white;
5671 switch( visibility ) {
5672 case VIS_CLEAR:
5673 // Already handled by the outer if statement
5674 break;
5675 case VIS_BOOMER:
5676 case VIS_BOOMER_DARK:
5677 visibility_indicator = '#';
5678 visibility_indicator_color = c_pink;
5679 break;
5680 case VIS_DARK:
5681 visibility_indicator = '#';
5682 visibility_indicator_color = c_dark_gray;
5683 break;
5684 case VIS_LIT:
5685 visibility_indicator = '#';
5686 visibility_indicator_color = c_light_gray;
5687 break;
5688 case VIS_HIDDEN:
5689 visibility_indicator = 'x';
5690 visibility_indicator_color = c_white;
5691 break;
5692 }
5693
5694 const tripoint screen_pos = point( POSX, POSY ) + lp - view_center;
5695 mvwputch( w_terrain, screen_pos.xy(), visibility_indicator_color, visibility_indicator );
5696 }
5697 }
5698}
void draw_cursor(const tripoint &p)
Definition: animation.cpp:724
T * critter_at(const tripoint &p, bool allow_hallucination=false)
Returns the Creature at the given location.
Definition: game.cpp:4498
bool is_enabled()
Definition: live_view.cpp:75
virtual bool inbounds(const tripoint &p) const
Definition: map.cpp:7831
visibility_type get_visibility(lit_level ll, const visibility_variables &cache) const
Definition: map.cpp:5723
lit_level apparent_light_at(const tripoint &p, const visibility_variables &cache) const
Determine the visible light level for a tile, based on light_at for the tile, vision distance,...
Definition: lightmap.cpp:729
void drawsq(const catacurses::window &w, const tripoint &p, const drawsq_params &params) const
Draw the map tile at the given coordinate.
Definition: map.cpp:5901
#define c_dark_gray
Definition: color.h:20
#define c_pink
Definition: color.h:31
visibility_type
Definition: enums.h:57
@ VIS_CLEAR
Definition: enums.h:59
@ VIS_BOOMER
Definition: enums.h:61
@ VIS_DARK
Definition: enums.h:62
@ VIS_BOOMER_DARK
Definition: enums.h:63
@ VIS_HIDDEN
Definition: enums.h:58
@ VIS_LIT
Definition: enums.h:60
bool is_draw_tiles_mode()
Check whether we're in tile drawing mode.
Definition: output.cpp:2075
Draw parameters used by map::drawsq() and similar methods.
Definition: map.h:180

References map::apparent_light_at(), c_dark_gray, c_light_gray, c_pink, c_white, center, creature, critter_at(), draw_cursor(), map::drawsq(), map::get_visibility(), map::inbounds(), is_draw_tiles_mode(), live_view::is_enabled(), liveview, m, mvwputch(), Character::pos(), POSX, POSY, Character::sees(), u, player::view_offset, VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, VIS_LIT, w_terrain, and tripoint::xy().

Referenced by look_around().

◆ draw_minimap()

void game::draw_minimap ( )
private

Definition at line 3275 of file game.cpp.

3276{
3277
3278 // Draw the box
3279 werase( w_minimap );
3281
3282 const tripoint_abs_omt curs = u.global_omt_location();
3283 const point_abs_omt curs2( curs.xy() );
3285 bool drew_mission = targ == overmap::invalid_tripoint;
3286
3287 for( int i = -2; i <= 2; i++ ) {
3288 for( int j = -2; j <= 2; j++ ) {
3289 const point_abs_omt om( curs2 + point( i, j ) );
3290 nc_color ter_color;
3291 tripoint_abs_omt omp( om, get_levz() );
3292 std::string ter_sym;
3293 const bool seen = overmap_buffer.seen( omp );
3294 const bool vehicle_here = overmap_buffer.has_vehicle( omp );
3295 if( overmap_buffer.has_note( omp ) ) {
3296
3297 const std::string &note_text = overmap_buffer.note( omp );
3298
3299 ter_color = c_yellow;
3300 ter_sym = "N";
3301
3302 int symbolIndex = note_text.find( ':' );
3303 int colorIndex = note_text.find( ';' );
3304
3305 bool symbolFirst = symbolIndex < colorIndex;
3306
3307 if( colorIndex > -1 && symbolIndex > -1 ) {
3308 if( symbolFirst ) {
3309 if( colorIndex > 4 ) {
3310 colorIndex = -1;
3311 }
3312 if( symbolIndex > 1 ) {
3313 symbolIndex = -1;
3314 colorIndex = -1;
3315 }
3316 } else {
3317 if( symbolIndex > 4 ) {
3318 symbolIndex = -1;
3319 }
3320 if( colorIndex > 2 ) {
3321 colorIndex = -1;
3322 }
3323 }
3324 } else if( colorIndex > 2 ) {
3325 colorIndex = -1;
3326 } else if( symbolIndex > 1 ) {
3327 symbolIndex = -1;
3328 }
3329
3330 if( symbolIndex > -1 ) {
3331 int symbolStart = 0;
3332 if( colorIndex > -1 && !symbolFirst ) {
3333 symbolStart = colorIndex + 1;
3334 }
3335 ter_sym = note_text.substr( symbolStart, symbolIndex - symbolStart ).c_str()[0];
3336 }
3337
3338 if( colorIndex > -1 ) {
3339
3340 int colorStart = 0;
3341
3342 if( symbolIndex > -1 && symbolFirst ) {
3343 colorStart = symbolIndex + 1;
3344 }
3345
3346 std::string sym = note_text.substr( colorStart, colorIndex - colorStart );
3347
3348 if( sym.length() == 2 ) {
3349 if( sym == "br" ) {
3350 ter_color = c_brown;
3351 } else if( sym == "lg" ) {
3352 ter_color = c_light_gray;
3353 } else if( sym == "dg" ) {
3354 ter_color = c_dark_gray;
3355 }
3356 } else {
3357 char colorID = sym.c_str()[0];
3358 if( colorID == 'r' ) {
3359 ter_color = c_light_red;
3360 } else if( colorID == 'R' ) {
3361 ter_color = c_red;
3362 } else if( colorID == 'g' ) {
3363 ter_color = c_light_green;
3364 } else if( colorID == 'G' ) {
3365 ter_color = c_green;
3366 } else if( colorID == 'b' ) {
3367 ter_color = c_light_blue;
3368 } else if( colorID == 'B' ) {
3369 ter_color = c_blue;
3370 } else if( colorID == 'W' ) {
3371 ter_color = c_white;
3372 } else if( colorID == 'C' ) {
3373 ter_color = c_cyan;
3374 } else if( colorID == 'c' ) {
3375 ter_color = c_light_cyan;
3376 } else if( colorID == 'P' ) {
3377 ter_color = c_pink;
3378 } else if( colorID == 'm' ) {
3379 ter_color = c_magenta;
3380 }
3381 }
3382 }
3383 } else if( !seen ) {
3384 ter_sym = " ";
3385 ter_color = c_black;
3386 } else if( vehicle_here ) {
3387 ter_color = c_cyan;
3388 ter_sym = "c";
3389 } else {
3390 const oter_id &cur_ter = overmap_buffer.ter( omp );
3391 ter_sym = cur_ter->get_symbol();
3392 if( overmap_buffer.is_explored( omp ) ) {
3393 ter_color = c_dark_gray;
3394 } else {
3395 ter_color = cur_ter->get_color();
3396 }
3397 }
3398 if( !drew_mission && targ.xy() == omp.xy() ) {
3399 // If there is a mission target, and it's not on the same
3400 // overmap terrain as the player character, mark it.
3401 // TODO: Inform player if the mission is above or below
3402 drew_mission = true;
3403 if( i != 0 || j != 0 ) {
3404 ter_color = red_background( ter_color );
3405 }
3406 }
3407 if( i == 0 && j == 0 ) {
3408 mvwputch_hi( w_minimap, point( 3, 3 ), ter_color, ter_sym );
3409 } else {
3410 mvwputch( w_minimap, point( 3 + i, 3 + j ), ter_color, ter_sym );
3411 }
3412 }
3413 }
3414
3415 // Print arrow to mission if we have one!
3416 if( !drew_mission ) {
3417 double slope = curs2.x() != targ.x() ?
3418 static_cast<double>( targ.y() - curs2.y() ) / ( targ.x() - curs2.x() ) : 4;
3419
3420 if( curs2.x() == targ.x() || std::fabs( slope ) > 3.5 ) { // Vertical slope
3421 if( targ.y() > curs2.y() ) {
3422 mvwputch( w_minimap, point( 3, 6 ), c_red, "*" );
3423 } else {
3424 mvwputch( w_minimap, point( 3, 0 ), c_red, "*" );
3425 }
3426 } else {
3427 int arrowx = -1;
3428 int arrowy = -1;
3429 if( std::fabs( slope ) >= 1. ) { // y diff is bigger!
3430 arrowy = targ.y() > curs2.y() ? 6 : 0;
3431 arrowx =
3432 static_cast<int>( 3 + 3 * ( targ.y() > curs2.y() ? slope : ( 0 - slope ) ) );
3433 if( arrowx < 0 ) {
3434 arrowx = 0;
3435 }
3436 if( arrowx > 6 ) {
3437 arrowx = 6;
3438 }
3439 } else {
3440 arrowx = targ.x() > curs2.x() ? 6 : 0;
3441 arrowy = static_cast<int>( 3 + 3 * ( targ.x() > curs2.x() ? slope : -slope ) );
3442 if( arrowy < 0 ) {
3443 arrowy = 0;
3444 }
3445 if( arrowy > 6 ) {
3446 arrowy = 6;
3447 }
3448 }
3449 char glyph = '*';
3450 if( targ.z() > u.posz() ) {
3451 glyph = '^';
3452 } else if( targ.z() < u.posz() ) {
3453 glyph = 'v';
3454 }
3455
3456 mvwputch( w_minimap, point( arrowx, arrowy ), c_red, glyph );
3457 }
3458 }
3459
3460 const int sight_points = g->u.overmap_sight_range( g->light_level( g->u.posz() ) );
3461 for( int i = -3; i <= 3; i++ ) {
3462 for( int j = -3; j <= 3; j++ ) {
3463 if( i > -3 && i < 3 && j > -3 && j < 3 ) {
3464 continue; // only do hordes on the border, skip inner map
3465 }
3466 const tripoint_abs_omt omp( curs2 + point( i, j ), get_levz() );
3468 if( overmap_buffer.seen( omp )
3469 && g->u.overmap_los( omp, sight_points ) ) {
3470 mvwputch( w_minimap, point( i + 3, j + 3 ), c_green,
3471 overmap_buffer.get_horde_size( omp ) > HORDE_VISIBILITY_SIZE * 2 ? 'Z' : 'z' );
3472 }
3473 }
3474 }
3475 }
3476
3478}
tripoint_abs_omt get_active_mission_target() const
Returns the target of the active mission or overmap::invalid_tripoint if there is no active mission.
Definition: avatar.cpp:206
constexpr auto & x()
Definition: coordinates.h:118
constexpr auto & z()
Definition: coordinates.h:133
constexpr auto & y()
Definition: coordinates.h:124
constexpr auto xy() const
Definition: coordinates.h:130
static constexpr tripoint_abs_omt invalid_tripoint
Dummy value, used to indicate that a point returned by a function is invalid.
Definition: overmap.h:260
bool seen(const tripoint_abs_omt &p)
const std::string & note(const tripoint_abs_omt &p)
int get_horde_size(const tripoint_abs_omt &p)
bool is_explored(const tripoint_abs_omt &p)
const oter_id & ter(const tripoint_abs_omt &p)
Returns the overmap terrain at the given OMT coordinates.
bool has_note(const tripoint_abs_omt &p)
Uses global overmap terrain coordinates.
bool has_vehicle(const tripoint_abs_omt &p)
nc_color red_background(const nc_color &c)
Definition: color.cpp:515
#define c_blue
Definition: color.h:23
#define c_black
Definition: color.h:17
#define c_light_blue
Definition: color.h:29
#define c_yellow
Definition: color.h:32
#define c_light_cyan
Definition: color.h:30
#define c_cyan
Definition: color.h:24
#define c_light_red
Definition: color.h:27
static constexpr int HORDE_VISIBILITY_SIZE
constexpr scale om
Definition: coordinates.h:34
void mvwputch_hi(const catacurses::window &w, const point &p, nc_color FG, int ch)
Definition: output.cpp:508
std::string get_symbol(const bool from_land_use_code=false) const
Definition: omdata.h:209
nc_color get_color(const bool from_land_use_code=false) const
Definition: omdata.h:217

References c_black, c_blue, c_brown, c_cyan, c_dark_gray, c_green, c_light_blue, c_light_cyan, c_light_gray, c_light_green, c_light_red, c_magenta, c_pink, c_red, c_white, c_yellow, draw_border(), units::fabs(), g, avatar::get_active_mission_target(), oter_t::get_color(), overmapbuffer::get_horde_size(), get_levz(), oter_t::get_symbol(), Character::global_omt_location(), overmapbuffer::has_note(), overmapbuffer::has_vehicle(), HORDE_VISIBILITY_SIZE, overmap::invalid_tripoint, overmapbuffer::is_explored(), mvwputch(), mvwputch_hi(), overmapbuffer::note(), coords::om, overmap_buffer, Character::posz(), red_background(), overmapbuffer::seen(), overmapbuffer::ter(), u, w_minimap, catacurses::werase(), catacurses::wnoutrefresh(), coords::coord_point< Point, Origin, Scale >::x(), coords::coord_point< Point, Origin, Scale >::xy(), coords::coord_point< Point, Origin, Scale >::y(), and coords::coord_point< Point, Origin, Scale >::z().

◆ draw_monster_override()

void game::draw_monster_override ( const tripoint p,
const mtype_id id,
int  count,
bool  more,
Creature::Attitude  att 
)

Definition at line 977 of file animation.cpp.

979{
980}

◆ draw_panels()

void game::draw_panels ( bool  force_draw = false)

Definition at line 3101 of file game.cpp.

3102{
3103 static int previous_turn = -1;
3104 const int current_turn = to_turns<int>( calendar::turn - calendar::turn_zero );
3105 const bool draw_this_turn = current_turn > previous_turn || force_draw;
3106 auto &mgr = panel_manager::get_manager();
3107 int y = 0;
3108 const bool sidebar_right = get_option<std::string>( "SIDEBAR_POSITION" ) == "right";
3109 int spacer = get_option<bool>( "SIDEBAR_SPACERS" ) ? 1 : 0;
3110 int log_height = 0;
3111 for( const window_panel &panel : mgr.get_current_layout() ) {
3112 if( panel.get_height() != -2 && panel.toggle && panel.render() ) {
3113 log_height += panel.get_height() + spacer;
3114 }
3115 }
3116 log_height = std::max( TERMY - log_height, 3 );
3117 for( const window_panel &panel : mgr.get_current_layout() ) {
3118 if( panel.render() ) {
3119 // height clamped to window height.
3120 int h = std::min( panel.get_height(), TERMY - y );
3121 if( h == -2 ) {
3122 h = log_height;
3123 }
3124 h += spacer;
3125 if( panel.toggle && panel.render() && h > 0 ) {
3126 if( panel.always_draw || draw_this_turn ) {
3127 panel.draw( u, catacurses::newwin( h, panel.get_width(),
3128 point( sidebar_right ? TERMX - panel.get_width() : 0, y ) ) );
3129 }
3130 if( show_panel_adm ) {
3131 const std::string panel_name = _( panel.get_name() );
3132 const int panel_name_width = utf8_width( panel_name );
3133 auto label = catacurses::newwin( 1, panel_name_width, point( sidebar_right ?
3134 TERMX - panel.get_width() - panel_name_width - 1 : panel.get_width() + 1, y ) );
3135 werase( label );
3136 mvwprintz( label, point_zero, c_light_red, panel_name );
3138 label = catacurses::newwin( h, 1,
3139 point( sidebar_right ? TERMX - panel.get_width() - 1 : panel.get_width(), y ) );
3140 werase( label );
3141 if( h == 1 ) {
3143 } else {
3145 for( int i = 1; i < h - 1; i++ ) {
3147 }
3148 mvwputch( label, point( 0, h - 1 ), c_light_red, sidebar_right ? LINE_XXOO : LINE_XOOX );
3149 }
3151 }
3152 y += h;
3153 }
3154 }
3155 }
3156 previous_turn = current_turn;
3157}
bool show_panel_adm
Definition: game.h:1014
const time_point turn_zero
Represents time point 0.
Definition: calendar.cpp:26
#define LINE_XOXO
Definition: output.h:39
#define LINE_OXOX
Definition: output.h:40
#define LINE_OXXX
Definition: output.h:48
#define LINE_XOOX
Definition: output.h:44
#define LINE_XXOO
Definition: output.h:41
Struct used for storing labels (easier to json opposed to a std::map<point, std::string>)
Definition: vehicle.h:579

References _, c_light_red, panel_manager::get_manager(), LINE_OXOX, LINE_OXXX, LINE_XOOX, LINE_XOXO, LINE_XXOO, mvwprintz(), mvwputch(), catacurses::newwin(), point_zero, show_panel_adm, TERMX, TERMY, calendar::turn, calendar::turn_zero, u, utf8_width(), catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by draw().

◆ draw_pixel_minimap()

void game::draw_pixel_minimap ( const catacurses::window w)

Definition at line 3159 of file game.cpp.

3160{
3161 w_pixel_minimap = w;
3162}

References w_pixel_minimap.

◆ draw_radiation_override()

void game::draw_radiation_override ( const tripoint p,
int  rad 
)

Definition at line 854 of file animation.cpp.

855{
856}

◆ draw_sct()

void game::draw_sct ( )

Definition at line 805 of file animation.cpp.

806{
807 draw_sct_curses( *this );
808}
void draw_sct_curses(const game &g)
Definition: animation.cpp:772

References anonymous_namespace{animation.cpp}::draw_sct_curses().

Referenced by get_player_input().

◆ draw_ter() [1/2]

void game::draw_ter ( bool  draw_sounds = true)

Definition at line 3215 of file game.cpp.

3216{
3218 draw_sounds );
3219}
bool is_looking
Definition: game.h:224

References draw_ter(), is_looking, Character::pos(), u, and player::view_offset.

Referenced by draw(), and draw_ter().

◆ draw_ter() [2/2]

void game::draw_ter ( const tripoint center,
bool  looking = false,
bool  draw_sounds = true 
)

Definition at line 3221 of file game.cpp.

3222{
3224
3225 m.draw( w_terrain, center );
3226
3227 if( draw_sounds ) {
3229 }
3230
3231 for( Creature &critter : all_creatures() ) {
3232 draw_critter( critter, center );
3233 }
3234
3235 if( !destination_preview.empty() && u.view_offset.z == 0 ) {
3236 // Draw auto-move preview trail
3237 const tripoint &final_destination = destination_preview.back();
3238 tripoint line_center = u.pos() + u.view_offset;
3239 draw_line( final_destination, line_center, destination_preview, true );
3240 mvwputch( w_terrain, final_destination.xy() - u.view_offset.xy() + point( POSX - u.posx(),
3241 POSY - u.posy() ), c_white, 'X' );
3242 }
3243
3244 if( u.controlling_vehicle && !looking ) {
3245 draw_veh_dir_indicator( false );
3246 draw_veh_dir_indicator( true );
3247 }
3248 // Place the cursor over the player as is expected by screen readers.
3249 wmove( w_terrain, -center.xy() + g->u.pos().xy() + point( POSX, POSY ) );
3250}
int posx() const override
Definition: character.h:786
int posy() const override
Definition: character.h:789
void draw_critter(const Creature &critter, const tripoint &center)
Definition: game.cpp:3197
Creature_range all_creatures()
Returns an anonymous range that contains all creatures.
Definition: game.cpp:11944
std::vector< tripoint > destination_preview
Definition: game.h:1066
void draw_veh_dir_indicator(bool next)
Definition: game.cpp:3267
void draw_line(const tripoint &p, const tripoint &center_point, const std::vector< tripoint > &points, bool noreveal=false)
Definition: animation.cpp:677
void draw(const catacurses::window &w, const tripoint &center)
Draw a visible part of the map into w.
Definition: map.cpp:5773
static void draw_footsteps(const catacurses::window &window, const tripoint &offset)
Definition: game.cpp:2887
void wmove(const window &win, const point &p)
Definition: ncurses_def.cpp:98

References all_creatures(), c_white, center, Character::controlling_vehicle, destination_preview, map::draw(), draw_critter(), draw_footsteps(), draw_line(), draw_veh_dir_indicator(), g, m, mvwputch(), Character::pos(), Character::posx(), POSX, Character::posy(), POSY, ter_view_p, u, player::view_offset, w_terrain, catacurses::wmove(), tripoint::xy(), and tripoint::z.

◆ draw_terrain_override()

void game::draw_terrain_override ( const tripoint p,
const ter_id id 
)

Definition at line 867 of file animation.cpp.

868{
869}

◆ draw_trail_to_square()

void game::draw_trail_to_square ( const tripoint t,
bool  bDrawX 
)

Definition at line 6962 of file game.cpp.

6963{
6964 ::draw_trail( u.pos(), u.pos() + t, bDrawX );
6965}
static void draw_trail(const tripoint &start, const tripoint &end, bool bDrawX)
Definition: game.cpp:6932

References draw_trail(), Character::pos(), and u.

◆ draw_trap_override()

void game::draw_trap_override ( const tripoint p,
const trap_id id 
)

Definition at line 906 of file animation.cpp.

907{
908}

◆ draw_veh_dir_indicator()

void game::draw_veh_dir_indicator ( bool  next)

Definition at line 3267 of file game.cpp.

3268{
3269 if( const cata::optional<tripoint> indicator_offset = get_veh_dir_indicator_location( next ) ) {
3270 auto col = next ? c_white : c_dark_gray;
3271 mvwputch( w_terrain, indicator_offset->xy() - u.view_offset.xy() + point( POSX, POSY ), col, 'X' );
3272 }
3273}
cata::optional< tripoint > get_veh_dir_indicator_location(bool next) const
Returns the location where the indicator should go relative to the reality bubble,...
Definition: game.cpp:3252

References c_dark_gray, c_white, get_veh_dir_indicator_location(), mvwputch(), POSX, POSY, u, player::view_offset, w_terrain, and tripoint::xy().

Referenced by draw_ter().

◆ draw_vpart_override()

void game::draw_vpart_override ( const tripoint p,
const vpart_id id,
int  part_mod,
units::angle  veh_dir,
bool  hilite,
const point mount 
)

Definition at line 949 of file animation.cpp.

951{
952}

◆ draw_weather()

void game::draw_weather ( const weather_printable wPrint)

Definition at line 764 of file animation.cpp.

765{
767}
void draw_weather_curses(const catacurses::window &win, const weather_printable &w)
Definition: animation.cpp:745

References anonymous_namespace{animation.cpp}::draw_weather_curses(), and w_terrain.

Referenced by get_player_input().

◆ draw_zones()

void game::draw_zones ( const tripoint start,
const tripoint end,
const tripoint offset 
)

Definition at line 840 of file animation.cpp.

841{
842 draw_zones_curses( w_terrain, start, end, offset );
843}
void draw_zones_curses(const catacurses::window &w, const tripoint &start, const tripoint &end, const tripoint &offset)
Definition: animation.cpp:813

References anonymous_namespace{animation.cpp}::draw_zones_curses(), and w_terrain.

◆ drop()

void game::drop ( )
private

Definition at line 8009 of file game.cpp.

8010{
8012}
void drop(item_location loc, const tripoint &where)
Drops an item to the specified location.
Definition: character.cpp:2423
drop_locations multidrop(player &p)
Select items to drop.

References Character::drop(), game_menus::inv::multidrop(), Character::pos(), and u.

Referenced by handle_action().

◆ drop_in_direction()

void game::drop_in_direction ( )
private

Definition at line 8014 of file game.cpp.

8015{
8016 if( const cata::optional<tripoint> pnt = choose_adjacent( _( "Drop where?" ) ) ) {
8017 u.drop( game_menus::inv::multidrop( u ), *pnt );
8018 }
8019}

References _, choose_adjacent(), Character::drop(), game_menus::inv::multidrop(), and u.

Referenced by handle_action().

◆ dump_stats()

bool game::dump_stats ( const std::string &  what,
dump_mode  mode,
const std::vector< std::string > &  opts 
)

write statistics to stdout and

Returns
true if successful

Definition at line 39 of file dump.cpp.

41{
42 try {
44 } catch( const std::exception &err ) {
45 std::cerr << "Error loading data from json: " << err.what() << std::endl;
46 return false;
47 }
48
49 std::vector<std::string> header;
50 std::vector<std::vector<std::string>> rows;
51
52 int scol = 0; // sorting column
53
54 std::map<std::string, standard_npc> test_npcs;
55 test_npcs[ "S1" ] = standard_npc( "S1", { 0, 0, 2 }, { "gloves_survivor", "mask_lsurvivor" },
56 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
57 test_npcs[ "S2" ] = standard_npc( "S2", { 0, 0, 3 }, { "gloves_fingerless", "sunglasses" },
58 4, 8, 8, 8, 10 /* PER 10 */ );
59 test_npcs[ "S3" ] = standard_npc( "S3", { 0, 0, 4 }, { "gloves_plate", "helmet_plate" },
60 4, 10, 8, 8, 8 /* STAT 10 */ );
61 test_npcs[ "S4" ] = standard_npc( "S4", { 0, 0, 5 }, {}, 0, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
62 test_npcs[ "S5" ] = standard_npc( "S5", { 0, 0, 6 }, {}, 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
63 test_npcs[ "S6" ] = standard_npc( "S6", { 0, 0, 7 }, { "gloves_hsurvivor", "mask_hsurvivor" },
64 4, 8, 10, 8, 10 /* DEX 10, PER 10 */ );
65
66 std::map<std::string, item> test_items;
67 test_items[ "G1" ] = item( "glock_19" ).ammo_set( itype_id( "9mm" ) );
68 test_items[ "G2" ] = item( "hk_mp5" ).ammo_set( itype_id( "9mm" ) );
69 test_items[ "G3" ] = item( "ar15" ).ammo_set( itype_id( "223" ) );
70 test_items[ "G4" ] = item( "remington_700" ).ammo_set( itype_id( "270" ) );
71 test_items[ "G4" ].put_in( item( "rifle_scope" ) );
72
73 if( what == "AMMO" ) {
74 header = {
75 "Name", "Ammo", "Volume", "Weight", "Stack",
76 "Range", "Dispersion", "Recoil", "Damage", "Pierce", "Damage multiplier"
77 };
78 auto dump = [&rows]( const item & obj ) {
79 std::vector<std::string> r;
80 r.push_back( obj.tname( 1, false ) );
81 r.push_back( obj.ammo_type().str() );
82 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
83 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
84 r.push_back( std::to_string( obj.type->stack_size ) );
85 r.push_back( std::to_string( obj.type->ammo->range ) );
86 r.push_back( std::to_string( obj.type->ammo->dispersion ) );
87 r.push_back( std::to_string( obj.type->ammo->recoil ) );
88 damage_instance damage = obj.type->ammo->damage;
89 r.push_back( std::to_string( damage.total_damage() ) );
90 r.push_back( std::to_string( damage.empty() ? 0 : ( *damage.begin() ).res_pen ) );
91 rows.push_back( r );
92 };
93 for( const itype *e : item_controller->all() ) {
94 if( e->ammo ) {
95 dump( item( e, calendar::turn, item::solitary_tag {} ) );
96 }
97 }
98
99 } else if( what == "ARMOR" ) {
100 header = {
101 "Name", "Encumber (fit)", "Warmth", "Weight", "Storage", "Coverage", "Bash", "Cut", "Bullet", "Acid", "Fire"
102 };
103 auto dump = [&rows]( const item & obj ) {
104 std::vector<std::string> r;
105 r.push_back( obj.tname( 1, false ) );
106 r.push_back( std::to_string( obj.get_encumber( g->u ) ) );
107 r.push_back( std::to_string( obj.get_warmth() ) );
108 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
109 r.push_back( std::to_string( obj.get_storage() / units::legacy_volume_factor ) );
110 r.push_back( std::to_string( obj.get_coverage() ) );
111 r.push_back( std::to_string( obj.bash_resist() ) );
112 r.push_back( std::to_string( obj.cut_resist() ) );
113 r.push_back( std::to_string( obj.bullet_resist() ) );
114 r.push_back( std::to_string( obj.acid_resist() ) );
115 r.push_back( std::to_string( obj.fire_resist() ) );
116 rows.push_back( r );
117 };
118
119 body_part bp = opts.empty() ? num_bp : get_body_part_token( opts.front() );
120
121 for( const itype *e : item_controller->all() ) {
122 if( e->armor ) {
123 item obj( e );
124 if( bp == num_bp || obj.covers( bp ) ) {
125 if( obj.has_flag( flag_VARSIZE ) ) {
126 obj.set_flag( "FIT" );
127 }
128 dump( obj );
129 }
130 }
131 }
132
133 } else if( what == "EDIBLE" ) {
134 header = {
135 "Name", "Volume", "Weight", "Stack", "Calories", "Quench", "Healthy"
136 };
137 for( const auto &v : vitamin::all() ) {
138 header.push_back( v.second.name() );
139 }
140 auto dump = [&rows]( const item & obj ) {
141 std::vector<std::string> r;
142 r.push_back( obj.tname( 1, false ) );
143 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
144 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
145 r.push_back( std::to_string( obj.type->stack_size ) );
146 r.push_back( std::to_string( obj.get_comestible()->default_nutrition.kcal ) );
147 r.push_back( std::to_string( obj.get_comestible()->quench ) );
148 r.push_back( std::to_string( obj.get_comestible()->healthy ) );
149 auto vits = obj.get_comestible()->default_nutrition.vitamins;
150 for( const auto &v : vitamin::all() ) {
151 r.push_back( std::to_string( vits[ v.first ] ) );
152 }
153 rows.push_back( r );
154 };
155
156 for( const itype *e : item_controller->all() ) {
158
159 if( food.is_food() && g->u.can_eat( food ).success() ) {
160 dump( food );
161 }
162 }
163
164 } else if( what == "GUN" ) {
165 header = {
166 "Name", "Ammo", "Volume", "Weight", "Capacity",
167 "Range", "Dispersion", "Effective recoil", "Damage", "Pierce",
168 "Aim time", "Effective range", "Snapshot range", "Max range"
169 };
170
171 std::set<std::string> locations;
172 for( const itype *e : item_controller->all() ) {
173 if( e->gun ) {
174 std::transform( e->gun->valid_mod_locations.begin(),
175 e->gun->valid_mod_locations.end(),
176 std::inserter( locations, locations.begin() ),
177 []( const std::pair<gunmod_location, int> &q ) {
178 return q.first.name();
179 } );
180 }
181 }
182 for( const auto &e : locations ) {
183 header.push_back( e );
184 }
185
186 auto dump = [&rows, &locations]( const standard_npc & who, const item & obj ) {
187 std::vector<std::string> r;
188 r.push_back( obj.tname( 1, false ) );
189 r.push_back( !obj.ammo_types().empty() ? enumerate_as_string( obj.ammo_types().begin(),
190 obj.ammo_types().end(), []( const ammotype & at ) {
191 return at.str();
193 r.push_back( std::to_string( obj.volume() / units::legacy_volume_factor ) );
194 r.push_back( std::to_string( to_gram( obj.weight() ) ) );
195 r.push_back( std::to_string( obj.ammo_capacity() ) );
196 r.push_back( std::to_string( obj.gun_range() ) );
197 r.push_back( std::to_string( obj.gun_dispersion() ) );
198 r.push_back( std::to_string( obj.gun_recoil() ) );
199 damage_instance damage = obj.gun_damage();
200 r.push_back( std::to_string( damage.total_damage() ) );
201 r.push_back( std::to_string( damage.empty() ? 0 : ( *damage.begin() ).res_pen ) );
202
203 r.push_back( std::to_string( ranged::gun_engagement_moves( who, obj ) ) );
204
205 for( const auto &e : locations ) {
206 const auto &vml = obj.type->gun->valid_mod_locations;
207 const auto iter = vml.find( e );
208 r.push_back( std::to_string( iter != vml.end() ? iter->second : 0 ) );
209 }
210 rows.push_back( r );
211 };
212 for( const itype *e : item_controller->all() ) {
213 if( e->gun ) {
214 item gun( e );
215 if( !gun.magazine_integral() ) {
216 gun.put_in( item( gun.magazine_default() ) );
217 }
218 gun.ammo_set( gun.ammo_default( false ), gun.ammo_capacity() );
219
220 dump( test_npcs[ "S1" ], gun );
221
222 if( gun.type->gun->barrel_length > 0_ml ) {
223 gun.put_in( item( "barrel_small" ) );
224 dump( test_npcs[ "S1" ], gun );
225 }
226 }
227 }
228
229 } else if( what == "RECIPE" ) {
230
231 // optionally filter recipes to include only those using specified skills
232 recipe_subset dict;
233 for( const auto &r : recipe_dict ) {
234 if( opts.empty() || std::any_of( opts.begin(), opts.end(), [&r]( const std::string & s ) {
235 if( r.second.skill_used == skill_id( s ) && r.second.difficulty > 0 ) {
236 return true;
237 }
238 const auto iter = r.second.required_skills.find( skill_id( s ) );
239 return iter != r.second.required_skills.end() && iter->second > 0;
240 } ) ) {
241 dict.include( &r.second );
242 }
243 }
244
245 // only consider skills that are required by at least one recipe
246 std::vector<Skill> sk;
247 std::copy_if( Skill::skills.begin(), Skill::skills.end(),
248 std::back_inserter( sk ), [&dict]( const Skill & s ) {
249 return std::any_of( dict.begin(), dict.end(), [&s]( const recipe * r ) {
250 return r->skill_used == s.ident() ||
251 r->required_skills.find( s.ident() ) != r->required_skills.end();
252 } );
253 } );
254
255 header = { "Result" };
256
257 for( const auto &e : sk ) {
258 header.push_back( e.ident().str() );
259 }
260
261 for( const recipe *e : dict ) {
262 std::vector<std::string> r;
263 r.push_back( e->result_name() );
264 for( const auto &s : sk ) {
265 if( e->skill_used == s.ident() ) {
266 r.push_back( std::to_string( e->difficulty ) );
267 } else {
268 auto iter = e->required_skills.find( s.ident() );
269 r.push_back( std::to_string( iter != e->required_skills.end() ? iter->second : 0 ) );
270 }
271 }
272 rows.push_back( r );
273 }
274
275 } else if( what == "VEHICLE" ) {
276 header = {
277 "Name", "Weight (empty)", "Weight (fueled)",
278 "Max velocity (mph)", "Safe velocity (mph)", "Acceleration (mph/turn)",
279 "Aerodynamics coeff", "Rolling coeff", "Static Drag", "Offroad %"
280 };
281 auto dump = [&rows]( const vproto_id & obj ) {
282 vehicle veh_empty( obj, 0, 0 );
283 vehicle veh_fueled( obj, 100, 0 );
284
285 std::vector<std::string> r;
286 r.push_back( veh_empty.name );
287 r.push_back( std::to_string( to_kilogram( veh_empty.total_mass() ) ) );
288 r.push_back( std::to_string( to_kilogram( veh_fueled.total_mass() ) ) );
289 r.push_back( std::to_string( veh_fueled.max_velocity() / 100 ) );
290 r.push_back( std::to_string( veh_fueled.safe_velocity() / 100 ) );
291 r.push_back( std::to_string( veh_fueled.acceleration() / 100 ) );
292 r.push_back( std::to_string( veh_fueled.coeff_air_drag() ) );
293 r.push_back( std::to_string( veh_fueled.coeff_rolling_drag() ) );
294 r.push_back( std::to_string( veh_fueled.static_drag( false ) ) );
295 r.push_back( std::to_string( static_cast<int>( 50 *
296 veh_fueled.k_traction( veh_fueled.wheel_area() ) ) ) );
297 rows.push_back( r );
298 };
299 for( auto &e : vehicle_prototype::get_all() ) {
300 dump( e );
301 }
302
303 } else if( what == "VPART" ) {
304 header = {
305 "Name", "Location", "Weight", "Size"
306 };
307 auto dump = [&rows]( const vpart_info & obj ) {
308 std::vector<std::string> r;
309 r.push_back( obj.name() );
310 r.push_back( obj.location );
311 int w = std::ceil( to_gram( item( obj.item ).weight() ) / 1000.0 );
312 r.push_back( std::to_string( w ) );
313 r.push_back( std::to_string( obj.size / units::legacy_volume_factor ) );
314 rows.push_back( r );
315 };
316 for( const auto &e : vpart_info::all() ) {
317 dump( e.second );
318 }
319
320 } else {
321 std::cerr << "unknown argument: " << what << std::endl;
322 return false;
323 }
324
325 rows.erase( std::remove_if( rows.begin(), rows.end(), []( const std::vector<std::string> &e ) {
326 return e.empty();
327 } ), rows.end() );
328
329 if( scol >= 0 ) {
330 std::sort( rows.begin(), rows.end(), [&scol]( const std::vector<std::string> &lhs,
331 const std::vector<std::string> &rhs ) {
332 return localized_compare( lhs[ scol ], rhs[ scol ] );
333 } );
334 }
335
336 rows.erase( std::unique( rows.begin(), rows.end() ), rows.end() );
337
338 switch( mode ) {
339 case dump_mode::TSV:
340 rows.insert( rows.begin(), header );
341 for( const auto &r : rows ) {
342 // NOLINTNEXTLINE(cata-text-style): using tab to align the output
343 std::copy( r.begin(), r.end() - 1, std::ostream_iterator<std::string>( std::cout, "\t" ) );
344 std::cout << r.back() << "\n";
345 }
346 break;
347
348 case dump_mode::HTML:
349 std::cout << "<table>";
350
351 std::cout << "<thead>";
352 std::cout << "<tr>";
353 for( const auto &col : header ) {
354 std::cout << "<th>" << col << "</th>";
355 }
356 std::cout << "</tr>";
357 std::cout << "</thead>";
358
359 std::cout << "<tdata>";
360 for( const auto &r : rows ) {
361 std::cout << "<tr>";
362 for( const auto &col : r ) {
363 std::cout << "<td>" << col << "</td>";
364 }
365 std::cout << "</tr>";
366 }
367 std::cout << "</tdata>";
368
369 std::cout << "</table>";
370 break;
371 }
372
373 return true;
374}
body_part get_body_part_token(const std::string &id)
Returns the matching body_part token from the corresponding body_part string.
Definition: bodypart.cpp:180
body_part
Definition: bodypart.h:39
std::string to_string(const time_duration &d)
Returns a string showing a duration.
Definition: calendar.cpp:327
Definition: skill.h:33
static std::vector< Skill > skills
Definition: skill.h:49
const skill_id & ident() const
Definition: skill.h:65
units::mass weight(bool include_contents=true, bool integral=false) const
Definition: item.cpp:4947
void put_in(const item &payload)
Puts the given item into this one, no checks are performed.
Definition: item.cpp:995
item & ammo_set(const itype_id &ammo, int qty=-1)
Filter setting the ammo for this instance Any existing ammo is removed.
Definition: item.cpp:590
std::set< constrecipe * >::const_iterator begin() const
std::set< constrecipe * >::const_iterator end() const
void include(const recipe *r, int custom_difficulty=-1)
Include a recipe to the subset.
Definition: recipe.h:35
An NPC with standard stats.
Definition: npc.h:1353
static const std::map< vitamin_id, vitamin > & all()
Get all currently loaded vitamins.
Definition: vitamin.cpp:98
static const std::map< vpart_id, vpart_info > & all()
Definition: veh_type.cpp:695
static const std::string flag_VARSIZE("VARSIZE")
std::unique_ptr< Item_factory > item_controller
void transform(player &p, const tripoint &pos)
Transform the examined object into the object specified by its transforms_into property.
Definition: iexamine.cpp:1639
void load_core_bn_modfiles()
Load & finalize modlist that consists of single vanilla BN core "mod".
Definition: init.cpp:861
int gun_engagement_moves(const Character &who, const item &gun, int target=0, int start=MAX_RECOIL)
How many moves does it take to aim gun to the target accuracy.
Definition: ranged.cpp:578
static constexpr volume legacy_volume_factor
Definition: units_volume.h:50
constexpr value_type to_gram(const quantity< value_type, mass_in_milligram_tag > &v)
Definition: units_mass.h:67
constexpr value_type to_kilogram(const quantity< value_type, mass_in_milligram_tag > &v)
Definition: units_mass.h:73
std::string enumerate_as_string(const _Container &values, enumeration_conjunction conj=enumeration_conjunction::and_)
Definition: output.h:637
recipe_dictionary recipe_dict
float total_damage() const
Definition: damage.cpp:75
std::vector< damage_unit >::iterator begin()
Definition: damage.cpp:120
bool empty() const
Definition: damage.cpp:88
Default (or randomized) charges except if counted by charges then only one charge.
Definition: item.h:231
Definition: itype.h:836
static std::vector< vproto_id > get_all()
Definition: veh_type.cpp:1157

References vitamin::all(), item::ammo_capacity(), item::ammo_default(), item::ammo_set(), damage_instance::begin(), item::covers(), damage_instance::empty(), enumerate_as_string(), flag_VARSIZE(), g, get_body_part_token(), itype::gun, ranged::gun_engagement_moves(), item::has_flag(), Skill::ident(), recipe_subset::include(), item_controller, itype_id, units::legacy_volume_factor, init::load_core_bn_modfiles(), anonymous_namespace{overmap_location.cpp}::locations, item::magazine_default(), item::magazine_integral(), none, num_bp, item::put_in(), recipe_dict, item::set_flag(), Skill::skills, units::to_gram(), to_string(), damage_instance::total_damage(), iexamine::transform(), calendar::turn, and item::type.

◆ events()

event_bus & game::events ( )

Definition at line 2702 of file game.cpp.

2703{
2704 return *event_bus_ptr;
2705}
pimpl< event_bus > event_bus_ptr
Definition: game.h:953

References event_bus_ptr.

Referenced by cleanup_at_end(), and game().

◆ exam_vehicle()

void game::exam_vehicle ( vehicle veh,
const point cp = point_zero 
)

open vehicle interaction screen

Definition at line 4955 of file game.cpp.

4956{
4957 if( veh.magic ) {
4958 add_msg( m_info, _( "This is your %s" ), veh.name );
4959 return;
4960 }
4961 auto act = veh_interact::run( veh, c );
4962 if( act ) {
4963 u.moves = 0;
4965 }
4966}
static player_activity run(vehicle &veh, const point &p)
bool magic
Definition: vehicle.h:1891
constexpr double c
Definition: magic.cpp:1032
activity_id act
Definition: sounds.cpp:75

References _, act, add_msg(), Character::assign_activity(), c, m_info, vehicle::magic, Creature::moves, vehicle::name, veh_interact::run(), and u.

◆ examine() [1/2]

void game::examine ( )
private

Definition at line 5346 of file game.cpp.

5347{
5348 // if we are driving a vehicle, examine the
5349 // current tile without asking.
5350 const optional_vpart_position vp = m.veh_at( u.pos() );
5351 if( vp && vp->vehicle().player_in_control( u ) ) {
5352 examine( u.pos() );
5353 return;
5354 }
5355
5356 const cata::optional<tripoint> examp_ = choose_adjacent_highlight( _( "Examine where?" ),
5357 _( "There is nothing that can be examined nearby." ),
5358 ACTION_EXAMINE, false );
5359 if( !examp_ ) {
5360 return;
5361 }
5362 u.manual_examine = true;
5363 examine( *examp_ );
5364 u.manual_examine = false;
5365}
cata::optional< tripoint > choose_adjacent_highlight(const std::string &message, const std::string &failure_message, const action_id action, bool allow_vertical)
Request player input of adjacent tile with highlighting, possibly on different z-level.
Definition: action.cpp:1042
@ ACTION_EXAMINE
Examine or pick up items from adjacent square.
Definition: action.h:105
void examine()
Definition: game.cpp:5346
bool manual_examine
Definition: player.h:249

References _, ACTION_EXAMINE, choose_adjacent_highlight(), examine(), m, player::manual_examine, Character::pos(), u, and map::veh_at().

Referenced by examine(), and handle_action().

◆ examine() [2/2]

void game::examine ( const tripoint p)
private

Definition at line 5434 of file game.cpp.

5435{
5436 if( disable_robot( examp ) ) {
5437 return;
5438 }
5439
5440 Creature *c = critter_at( examp );
5441 if( c != nullptr ) {
5442 monster *mon = dynamic_cast<monster *>( c );
5443 if( mon != nullptr ) {
5444 add_msg( _( "There is a %s." ), mon->get_name() );
5445 if( mon->has_effect( effect_pet ) && !u.is_mounted() ) {
5446 if( monexamine::pet_menu( *mon ) ) {
5447 return;
5448 }
5449 } else if( mon->has_flag( MF_RIDEABLE_MECH ) && !mon->has_effect( effect_pet ) ) {
5450 if( monexamine::mech_hack( *mon ) ) {
5451 return;
5452 }
5453 } else if( mon->has_flag( MF_PAY_BOT ) ) {
5454 if( monexamine::pay_bot( *mon ) ) {
5455 return;
5456 }
5457 } else if( mon->attitude_to( u ) == Creature::A_FRIENDLY && !u.is_mounted() ) {
5458 if( monexamine::mfriend_menu( *mon ) ) {
5459 return;
5460 }
5461 }
5462 } else if( u.is_mounted() ) {
5463 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5464 }
5465 npc *np = dynamic_cast<npc *>( c );
5466 if( np != nullptr && !u.is_mounted() ) {
5467 if( npc_menu( *np ) ) {
5468 return;
5469 }
5470 } else if( np != nullptr && u.is_mounted() ) {
5471 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5472 }
5473 }
5474
5475 const optional_vpart_position vp = m.veh_at( examp );
5476 if( vp && u.is_mounted() ) {
5477 if( !u.mounted_creature->has_flag( MF_RIDEABLE_MECH ) ) {
5478 add_msg( m_warning, _( "You cannot interact with a vehicle while mounted." ) );
5479 } else {
5480 vp->vehicle().interact_with( examp, vp->part_index() );
5481 return;
5482 }
5483 } else if( vp && !u.is_mounted() ) {
5484 vp->vehicle().interact_with( examp, vp->part_index() );
5485 return;
5486 }
5487
5488 if( m.has_flag( "CONSOLE", examp ) && !u.is_mounted() ) {
5489 use_computer( examp );
5490 return;
5491 } else if( m.has_flag( "CONSOLE", examp ) && u.is_mounted() ) {
5492 add_msg( m_warning, _( "You cannot use a console while mounted." ) );
5493 }
5494 const furn_t &xfurn_t = m.furn( examp ).obj();
5495 const ter_t &xter_t = m.ter( examp ).obj();
5496
5497 const tripoint player_pos = u.pos();
5498
5499 if( m.has_furn( examp ) && !u.is_mounted() ) {
5500 xfurn_t.examine( u, examp );
5501 } else if( m.has_furn( examp ) && u.is_mounted() ) {
5502 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5503 } else {
5504 if( !u.is_mounted() ) {
5505 xter_t.examine( u, examp );
5506 } else if( u.is_mounted() && xter_t.examine == &iexamine::none ) {
5507 xter_t.examine( u, examp );
5508 } else {
5509 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5510 }
5511 }
5512
5513 // Did the player get moved? Bail out if so; our examp probably
5514 // isn't valid anymore.
5515 if( player_pos != u.pos() ) {
5516 return;
5517 }
5518
5519 bool none = true;
5520 if( xter_t.examine != &iexamine::none || xfurn_t.examine != &iexamine::none ) {
5521 none = false;
5522 }
5523
5524 if( !m.tr_at( examp ).is_null() && !u.is_mounted() ) {
5525 iexamine::trap( u, examp );
5526 } else if( !m.tr_at( examp ).is_null() && u.is_mounted() ) {
5527 add_msg( m_warning, _( "You cannot do that while mounted." ) );
5528 }
5529
5530 // In case of teleport trap or somesuch
5531 if( player_pos != u.pos() ) {
5532 return;
5533 }
5534
5535 // Feedback for fire lasting time, this can be judged while mounted
5536 const std::string fire_fuel = get_fire_fuel_string( examp );
5537 if( !fire_fuel.empty() ) {
5538 add_msg( fire_fuel );
5539 }
5540
5541 if( m.has_flag( "SEALED", examp ) ) {
5542 if( none ) {
5543 if( m.has_flag( "UNSTABLE", examp ) ) {
5544 add_msg( _( "The %s is too unstable to remove anything." ), m.name( examp ) );
5545 } else {
5546 add_msg( _( "The %s is firmly sealed." ), m.name( examp ) );
5547 }
5548 }
5549 } else {
5550 //examp has no traps, is a container and doesn't have a special examination function
5551 if( m.tr_at( examp ).is_null() && m.i_at( examp ).empty() &&
5552 m.has_flag( "CONTAINER", examp ) && none ) {
5553 add_msg( _( "It is empty." ) );
5554 } else if( ( m.has_flag( TFLAG_FIRE_CONTAINER, examp ) &&
5555 xfurn_t.examine == &iexamine::fireplace ) ||
5556 xfurn_t.examine == &iexamine::workbench ||
5557 xfurn_t.examine == &iexamine::transform ) {
5558 return;
5559 } else {
5561 if( !u.is_mounted() ) {
5562 pickup::pick_up( examp, 0 );
5563 }
5564 }
5565 }
5566}
shared_ptr_fast< monster > mounted_creature
Definition: character.h:1581
@ A_FRIENDLY
Definition: creature.h:169
void use_computer(const tripoint &p)
Checks to see if a player can use a computer (not illiterate, etc.) and uses if able.
Definition: game.cpp:4466
bool disable_robot(const tripoint &p)
If there is a robot (that can be disabled), query the player and try to disable it.
Definition: game.cpp:8595
bool npc_menu(npc &who)
Returns true if the menu handled stuff and player shouldn't do anything else.
Definition: game.cpp:5237
bool empty() const
Definition: item_stack.cpp:15
bool has_furn(const tripoint &p) const
Definition: map.cpp:1401
const trap & tr_at(const tripoint &p) const
Definition: map.cpp:5198
ter_id ter(const tripoint &p) const
Definition: map.cpp:1556
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
Definition: monster.cpp:1049
std::string get_name() const override
Definition: monster.cpp:488
static std::string get_fire_fuel_string(const tripoint &examp)
Definition: game.cpp:5367
@ TFLAG_FIRE_CONTAINER
Definition: mapdata.h:293
void fireplace(player &p, const tripoint &examp)
Definition: iexamine.cpp:2916
void workbench(player &p, const tripoint &examp)
Definition: iexamine.cpp:6194
void none(player &p, const tripoint &examp)
Nothing player can interact with here.
Definition: iexamine.cpp:252
void trap(player &p, const tripoint &examp)
Definition: iexamine.cpp:3815
bool pet_menu(monster &z)
Definition: monexamine.cpp:67
bool mech_hack(monster &z)
Definition: monexamine.cpp:428
bool mfriend_menu(monster &z)
Definition: monexamine.cpp:502
bool pay_bot(monster &z)
Definition: monexamine.cpp:461
void pick_up(const tripoint &p, int min, from_where get_items_from=prompt)
Pick up items; 'g' or ',' or via examine()
Definition: pickup.cpp:572
iexamine_function examine
Definition: mapdata.h:402
Definition: mapdata.h:461
bool is_null() const
Whether this is the null-traps, aka no trap at all.
Definition: trap.cpp:245

References _, Creature::A_FRIENDLY, add_msg(), monster::attitude_to(), c, critter_at(), disable_robot(), effect_pet, item_stack::empty(), map_data_common_t::examine, iexamine::fireplace(), map::furn(), get_fire_fuel_string(), monster::get_name(), Creature::has_effect(), map::has_flag(), monster::has_flag(), map::has_furn(), map::i_at(), Character::is_mounted(), trap::is_null(), m, m_warning, monexamine::mech_hack(), MF_PAY_BOT, MF_RIDEABLE_MECH, monexamine::mfriend_menu(), Character::mounted_creature, map::name(), none, iexamine::none(), npc_menu(), int_id< T >::obj(), monexamine::pay_bot(), monexamine::pet_menu(), pickup::pick_up(), Character::pos(), sounds::process_sound_markers(), map::ter(), TFLAG_FIRE_CONTAINER, map::tr_at(), iexamine::transform(), iexamine::trap(), u, use_computer(), map::veh_at(), and iexamine::workbench().

◆ extended_description()

void game::extended_description ( const tripoint p)

Long description of (visible) things at tile.

Definition at line 51 of file descriptions.cpp.

52{
54 const int top = 3;
55 int width = 0;
56 catacurses::window w_head;
57 catacurses::window w_main;
58 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
59 const int left = 0;
60 const int right = TERMX;
61 const int bottom = TERMY;
62 width = right - left;
63 const int height = bottom - top;
64 w_head = catacurses::newwin( top, TERMX, point_zero );
65 w_main = catacurses::newwin( height, width, point( left, top ) );
66 ui.position( point_zero, point( TERMX, TERMY ) );
67 } );
68 ui.mark_resize();
69
70 // Default to critter (if any), furniture (if any), then terrain.
72 if( seen_critter( *this, p ) != nullptr ) {
74 } else if( get_map().has_furn( p ) ) {
76 }
77
78 std::string action;
79 input_context ctxt( "EXTENDED_DESCRIPTION" );
80 ctxt.register_action( "CREATURE" );
81 ctxt.register_action( "FURNITURE" );
82 ctxt.register_action( "TERRAIN" );
83 ctxt.register_action( "CONFIRM" );
84 ctxt.register_action( "QUIT" );
85 ctxt.register_action( "HELP_KEYBINDINGS" );
86
87 ui.on_redraw( [&]( const ui_adaptor & ) {
88 werase( w_head );
90 _( "[%s] describe creatures, [%s] describe furniture, "
91 "[%s] describe terrain, [%s] close." ),
92 ctxt.get_desc( "CREATURE" ), ctxt.get_desc( "FURNITURE" ),
93 ctxt.get_desc( "TERRAIN" ), ctxt.get_desc( "QUIT" ) );
94
95 // Set up line drawings
96 for( int i = 0; i < TERMX; i++ ) {
97 mvwputch( w_head, point( i, top - 1 ), c_white, LINE_OXOX );
98 }
99
100 wnoutrefresh( w_head );
101
102 std::string desc;
103 // Allow looking at invisible tiles - player may want to examine hallucinations etc.
104 switch( cur_target ) {
106 const Creature *critter = seen_critter( *this, p );
107 if( critter != nullptr ) {
108 desc = critter->extended_description();
109 } else {
110 desc = _( "You do not see any creature here." );
111 }
112 }
113 break;
115 if( !u.sees( p ) || !m.has_furn( p ) ) {
116 desc = _( "You do not see any furniture here." );
117 } else {
118 const furn_id fid = m.furn( p );
119 if( display_mod_source ) {
120 const std::string mod_src = enumerate_as_string( fid->src.begin(),
121 fid->src.end(), []( const std::pair<furn_str_id, mod_id> &source ) {
122 return string_format( "'%s'", source.second->name() );
124 desc = string_format( _( "Origin: %s\n" ), mod_src );
125 }
126 if( display_object_ids ) {
127 desc += colorize( string_format( "[%s]\n", fid.id() ), c_light_blue );
128 }
129 desc += fid.obj().extended_description();
130 }
131 break;
133 if( !u.sees( p ) ) {
134 desc = _( "You can't see the terrain here." );
135 } else {
136 const ter_id tid = m.ter( p );
137 if( display_mod_source ) {
138 const std::string mod_src = enumerate_as_string( tid->src.begin(),
139 tid->src.end(), []( const std::pair<ter_str_id, mod_id> &source ) {
140 return string_format( "'%s'", source.second->name() );
142 desc = string_format( _( "Origin: %s\n" ), mod_src );
143 }
144 if( display_object_ids ) {
145 desc += colorize( string_format( "[%s]\n", tid.id() ), c_light_blue );
146 }
147 desc += tid.obj().extended_description();
148 }
149 break;
150 }
151
152 std::string signage = m.get_signage( p );
153 if( !signage.empty() ) {
154 // NOLINTNEXTLINE(cata-text-style): the question mark does not end a sentence
155 desc += u.has_trait( trait_ILLITERATE ) ? _( "\nSign: ???" ) : string_format( _( "\nSign: %s" ),
156 signage );
157 }
158
159 werase( w_main );
160 fold_and_print_from( w_main, point_zero, width, 0, c_light_gray, desc );
161 wnoutrefresh( w_main );
162 } );
163
164 do {
166 action = ctxt.handle_input();
167 if( action == "CREATURE" ) {
168 cur_target = description_target::creature;
169 } else if( action == "FURNITURE" ) {
171 } else if( action == "TERRAIN" ) {
172 cur_target = description_target::terrain;
173 }
174 } while( action != "CONFIRM" && action != "QUIT" );
175}
bool display_object_ids
Display internal IDs for items, furniture, terrain and monsters.
bool display_mod_source
Display mod source for items, furniture, terrain and monsters.
virtual std::string extended_description() const =0
friend map & get_map()
Definition: map.cpp:146
const string_id< T > & id() const
Definition: ammo_effect.cpp:33
std::string get_signage(const tripoint &p) const
Definition: map.cpp:4059
std::string colorize(const std::string &text, const nc_color &color)
Definition: color.cpp:669
static const trait_id trait_ILLITERATE("ILLITERATE")
static const Creature * seen_critter(const game &g, const tripoint &p)
description_target
int fold_and_print_from(const catacurses::window &w, const point &begin, int width, int begin_line, const nc_color &base_color, const std::string &text)
Like fold_and_print, but starts the output with the N-th line of the folded string.
Definition: output.cpp:311
std::vector< std::pair< furn_str_id, mod_id > > src
Definition: mapdata.h:498
std::string extended_description() const
std::vector< std::pair< ter_str_id, mod_id > > src
Definition: mapdata.h:463

References _, action, arrow, c_light_blue, c_light_gray, c_white, colorize(), creature, display_mod_source, display_object_ids, enumerate_as_string(), map_data_common_t::extended_description(), Creature::extended_description(), fold_and_print_from(), map::furn(), furniture, input_context::get_desc(), get_map, map::get_signage(), input_context::handle_input(), map::has_furn(), Character::has_trait(), int_id< T >::id(), left, LINE_OXOX, m, mvwprintz(), mvwputch(), catacurses::newwin(), int_id< T >::obj(), point_zero, ui_manager::redraw(), input_context::register_action(), right, seen_critter(), Character::sees(), ter_t::src, furn_t::src, string_format(), map::ter(), TERMX, TERMY, terrain, trait_ILLITERATE, u, catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by look_around().

◆ find_nearby_items()

std::vector< map_item_stack > game::find_nearby_items ( int  iRadius)
private

Definition at line 6890 of file game.cpp.

6891{
6892 std::map<std::string, map_item_stack> temp_items;
6893 std::vector<map_item_stack> ret;
6894 std::vector<std::string> item_order;
6895
6896 if( u.is_blind() ) {
6897 return ret;
6898 }
6899
6900 int range = fov_3d ? ( fov_3d_z_range * 2 ) + 1 : 1;
6901 int center_z = u.pos().z;
6902
6903 for( int i = 1; i <= range; i++ ) {
6904 int z = i % 2 ? center_z - i / 2 : center_z + i / 2;
6905 for( auto &points_p_it : closest_points_first( {u.pos().xy(), z}, iRadius ) ) {
6906 if( points_p_it.y >= u.posy() - iRadius && points_p_it.y <= u.posy() + iRadius &&
6907 u.sees( points_p_it ) &&
6908 m.sees_some_items( points_p_it, u ) ) {
6909
6910 for( auto &elem : m.i_at( points_p_it ) ) {
6911 const std::string name = elem.tname();
6912 const tripoint relative_pos = points_p_it - u.pos();
6913
6914 if( std::find( item_order.begin(), item_order.end(), name ) == item_order.end() ) {
6915 item_order.push_back( name );
6916 temp_items[name] = map_item_stack( &elem, relative_pos );
6917 } else {
6918 temp_items[name].add_at_pos( &elem, relative_pos );
6919 }
6920 }
6921 }
6922 }
6923 }
6924
6925 for( auto &elem : item_order ) {
6926 ret.push_back( temp_items[elem] );
6927 }
6928
6929 return ret;
6930}
int fov_3d_z_range
3D FoV range, in Z levels, in both directions.
bool fov_3d
3D FoV enabled/disabled.
bool is_blind() const
Returns true if the player isn't able to see.
Definition: character.cpp:6237
std::vector< coords::coord_point< Point, Origin, Scale > > closest_points_first(const coords::coord_point< Point, Origin, Scale > &loc, int min_dist, int max_dist)
Definition: coordinates.h:596

References closest_points_first(), detail::find(), fov_3d, fov_3d_z_range, map::i_at(), Character::is_blind(), m, om_direction::name(), Character::pos(), Character::posy(), cata::hash64_detail::ret, Character::sees(), map::sees_some_items(), u, and tripoint::z.

Referenced by list_items_monsters().

◆ find_npc()

npc * game::find_npc ( character_id  id)

Find the npc with the given ID.

Returns NULL if the npc could not be found. Searches all loaded overmaps.

Definition at line 1869 of file game.cpp.

1870{
1871 return overmap_buffer.find_npc( id ).get();
1872}

References overmapbuffer::find_npc(), and overmap_buffer.

Referenced by critter_by_id().

◆ find_or_make_stairs()

cata::optional< tripoint > game::find_or_make_stairs ( map mp,
int  z_after,
bool &  rope_ladder,
bool  peeking 
)

Returns the other end of the stairs (if any).

May query, affect u etc.

Definition at line 10384 of file game.cpp.

10386{
10387 const int omtilesz = SEEX * 2;
10388 real_coords rc( m.getabs( point( u.posx(), u.posy() ) ) );
10389 tripoint omtile_align_start( m.getlocal( rc.begin_om_pos() ), z_after );
10390 tripoint omtile_align_end( omtile_align_start + point( -1 + omtilesz, -1 + omtilesz ) );
10391
10392 // Try to find the stairs.
10394 int best = INT_MAX;
10395 const int movez = z_after - get_levz();
10396 const bool going_down_1 = movez == -1;
10397 const bool going_up_1 = movez == 1;
10398 // If there are stairs on the same x and y as we currently are, use those
10399 if( going_down_1 && mp.has_flag( TFLAG_GOES_UP, u.pos() + tripoint_below ) ) {
10400 stairs.emplace( u.pos() + tripoint_below );
10401 }
10402 if( going_up_1 && mp.has_flag( TFLAG_GOES_DOWN, u.pos() + tripoint_above ) ) {
10403 stairs.emplace( u.pos() + tripoint_above );
10404 }
10405 // We did not find stairs directly above or below, so search the map for them
10406 if( !stairs.has_value() ) {
10407 for( const tripoint &dest : m.points_in_rectangle( omtile_align_start, omtile_align_end ) ) {
10408 if( rl_dist( u.pos(), dest ) <= best &&
10409 ( ( going_down_1 && mp.has_flag( TFLAG_GOES_UP, dest ) ) ||
10410 ( going_up_1 && ( mp.has_flag( TFLAG_GOES_DOWN, dest ) ||
10411 mp.ter( dest ) == t_manhole_cover ) ) ||
10412 ( ( movez == 2 || movez == -2 ) && mp.ter( dest ) == t_elevator ) ) ) {
10413 stairs.emplace( dest );
10414 best = rl_dist( u.pos(), dest );
10415 }
10416 }
10417 }
10418
10419 if( stairs.has_value() ) {
10420 if( Creature *blocking_creature = critter_at( stairs.value() ) ) {
10421 npc *guy = dynamic_cast<npc *>( blocking_creature );
10422 monster *mon = dynamic_cast<monster *>( blocking_creature );
10423 bool would_move = ( guy && !guy->is_enemy() ) || ( mon && mon->friendly == -1 );
10424 bool can_displace = find_empty_spot_nearby( *stairs ).has_value();
10425 std::string cr_name = blocking_creature->get_name();
10426 std::string msg;
10427 if( guy ) {
10428 //~ %s is the name of hostile NPC
10429 msg = string_format( _( "%s is in the way!" ), cr_name );
10430 } else {
10431 //~ %s is some monster
10432 msg = string_format( _( "There's a %s in the way!" ), cr_name );
10433 }
10434
10435 if( ( peeking && !would_move ) || !can_displace || ( !would_move && !query_yn(
10436 //~ %s is a warning about monster/hostile NPC in the way, e.g. "There's a zombie in the way!"
10437 _( "%s Attempt to push past? You may have to fight your way back up." ), msg ) ) ) {
10438 add_msg( msg );
10439 return cata::nullopt;
10440 }
10441 }
10442 return stairs;
10443 }
10444
10445 // No stairs found! Try to make some
10446 rope_ladder = false;
10447 stairs.emplace( u.pos() );
10448 stairs->z = z_after;
10449 // Check the destination area for lava.
10450 if( mp.ter( *stairs ) == t_lava ) {
10451 if( movez < 0 &&
10452 !query_yn(
10453 _( "There is a LOT of heat coming out of there, even the stairs have melted away. Jump down? You won't be able to get back up." ) ) ) {
10454 return cata::nullopt;
10455 } else if( movez > 0 &&
10456 !query_yn(
10457 _( "There is a LOT of heat coming out of there. Push through the half-molten rocks and ascend? You will not be able to get back down." ) ) ) {
10458 return cata::nullopt;
10459 }
10460
10461 return stairs;
10462 }
10463
10464 if( movez > 0 ) {
10465 if( !mp.has_flag( "GOES_DOWN", *stairs ) ) {
10466 if( !query_yn( _( "You may be unable to return back down these stairs. Continue up?" ) ) ) {
10467 return cata::nullopt;
10468 }
10469 }
10470 // Manhole covers need this to work
10471 // Maybe require manhole cover here and fail otherwise?
10472 return stairs;
10473 }
10474
10475 if( mp.impassable( *stairs ) ) {
10476 popup( _( "Halfway down, the way down becomes blocked off." ) );
10477 return cata::nullopt;
10478 }
10479
10480 if( u.has_trait( trait_id( "WEB_RAPPEL" ) ) ) {
10481 if( query_yn( _( "There is a sheer drop halfway down. Web-descend?" ) ) ) {
10482 rope_ladder = true;
10483 if( ( rng( 4, 8 ) ) < u.get_skill_level( skill_dodge ) ) {
10484 add_msg( _( "You attach a web and dive down headfirst, flipping upright and landing on your feet." ) );
10485 } else {
10486 add_msg( _( "You securely web up and work your way down, lowering yourself safely." ) );
10487 }
10488 } else {
10489 return cata::nullopt;
10490 }
10491 } else if( u.has_trait( trait_VINES2 ) || u.has_trait( trait_VINES3 ) ) {
10492 if( query_yn( _( "There is a sheer drop halfway down. Use your vines to descend?" ) ) ) {
10493 if( u.has_trait( trait_VINES2 ) ) {
10494 if( query_yn( _( "Detach a vine? It'll hurt, but you'll be able to climb back up…" ) ) ) {
10495 rope_ladder = true;
10496 add_msg( m_bad, _( "You descend on your vines, though leaving a part of you behind stings." ) );
10497 u.mod_pain( 5 );
10498 u.apply_damage( nullptr, bodypart_id( "torso" ), 5 );
10499 u.mod_stored_nutr( 10 );
10500 u.mod_thirst( 10 );
10501 } else {
10502 add_msg( _( "You gingerly descend using your vines." ) );
10503 }
10504 } else {
10505 add_msg( _( "You effortlessly lower yourself and leave a vine rooted for future use." ) );
10506 rope_ladder = true;
10507 u.mod_stored_nutr( 10 );
10508 u.mod_thirst( 10 );
10509 }
10510 } else {
10511 return cata::nullopt;
10512 }
10513 } else if( u.has_amount( itype_grapnel, 1 ) ) {
10514 if( query_yn( _( "There is a sheer drop halfway down. Climb your grappling hook down?" ) ) ) {
10515 rope_ladder = true;
10517 } else {
10518 return cata::nullopt;
10519 }
10520 } else if( u.has_amount( itype_rope_30, 1 ) ) {
10521 if( query_yn( _( "There is a sheer drop halfway down. Climb your rope down?" ) ) ) {
10522 rope_ladder = true;
10524 } else {
10525 return cata::nullopt;
10526 }
10527 } else if( !query_yn( _( "There is a sheer drop halfway down. Jump?" ) ) ) {
10528 return cata::nullopt;
10529 }
10530
10531 return stairs;
10532}
int_id< body_part_type > bodypart_id
Definition: bodypart.h:23
void mod_pain(int npain) override
Modifies a pain value by player traits before passing it to Creature::mod_pain()
Definition: character.cpp:750
void apply_damage(Creature *source, bodypart_id hurt, int dam, bool bypass_med=false) override
Actually hurt the player, hurts a body_part directly, no armor reduction.
Definition: character.cpp:8358
std::list< item > use_amount(itype_id it, int quantity, const std::function< bool(const item &)> &filter=return_true< item >)
Definition: character.cpp:9582
virtual void mod_thirst(int nthirst)
Definition: character.cpp:4402
virtual void mod_stored_nutr(int nnutr)
Definition: character.cpp:4292
int get_skill_level(const skill_id &ident) const
Definition: character.cpp:3317
T & emplace(Args &&... args)
Definition: optional.h:146
constexpr bool has_value() const noexcept
Definition: optional.h:123
tripoint getlocal(const tripoint &p) const
Inverse of getabs.
Definition: map.cpp:8340
bool impassable(const tripoint &p) const
Definition: map.cpp:1853
tripoint_range< tripoint > points_in_rectangle(const tripoint &from, const tripoint &to) const
Definition: map.cpp:8669
bool is_enemy() const
Definition: npc.cpp:2059
static const trait_id trait_VINES2("VINES2")
static const skill_id skill_dodge("dodge")
static cata::optional< tripoint > find_empty_spot_nearby(const tripoint &pos)
Definition: game.cpp:9920
static const itype_id itype_rope_30("rope_30")
static const itype_id itype_grapnel("grapnel")
static const trait_id trait_VINES3("VINES3")
ter_id t_manhole_cover
Definition: mapdata.cpp:722
ter_id t_lava
Definition: mapdata.cpp:697
ter_id t_elevator
Definition: mapdata.cpp:725
@ TFLAG_GOES_DOWN
Definition: mapdata.h:308
@ TFLAG_GOES_UP
Definition: mapdata.h:309
static constexpr nullopt_t nullopt
Definition: optional.h:22
static constexpr tripoint tripoint_below
Definition: point.h:281
static constexpr tripoint tripoint_above
Definition: point.h:280

References _, add_msg(), Character::apply_damage(), real_coords::begin_om_pos(), critter_at(), cata::optional< T >::emplace(), find_empty_spot_nearby(), monster::friendly, get_levz(), Character::get_skill_level(), map::getabs(), map::getlocal(), visitable< T >::has_amount(), map::has_flag(), Character::has_trait(), cata::optional< T >::has_value(), map::impassable(), npc::is_enemy(), itype_grapnel, itype_rope_30, m, m_bad, Character::mod_pain(), Character::mod_stored_nutr(), Character::mod_thirst(), cata::nullopt, map::points_in_rectangle(), popup(), Character::pos(), Character::posx(), Character::posy(), query_yn(), rl_dist(), rng(), SEEX, skill_dodge, string_format(), t_elevator, t_lava, t_manhole_cover, map::ter(), TFLAG_GOES_DOWN, TFLAG_GOES_UP, trait_VINES2, trait_VINES3, tripoint_above, tripoint_below, u, Character::use_amount(), and cata::optional< T >::value().

Referenced by vertical_move().

◆ fling_creature()

void game::fling_creature ( Creature c,
const units::angle dir,
float  flvel,
bool  controlled = false,
bool  suppress_map_update = false 
)

Flings the input creature in the given direction.

Definition at line 9722 of file game.cpp.

9724{
9725 if( c == nullptr ) {
9726 debugmsg( "game::fling_creature invoked on null target" );
9727 return;
9728 }
9729
9730 if( c->is_dead_state() ) {
9731 // Flinging a corpse causes problems, don't enable without testing
9732 return;
9733 }
9734
9735 if( c->is_hallucination() ) {
9736 // Don't fling hallucinations
9737 return;
9738 }
9739
9740 bool thru = true;
9741 const bool is_u = ( c == &u );
9742 // Don't animate critters getting bashed if animations are off
9743 const bool animate = is_u || get_option<bool>( "ANIMATIONS" );
9744
9745 player *p = dynamic_cast<player *>( c );
9746
9747 tileray tdir( dir );
9748 int range = flvel / 10;
9749 tripoint pt = c->pos();
9750 tripoint prev_point = pt;
9751 bool force_next = false;
9752 tripoint next_forced;
9753 while( range > 0 ) {
9754 c->set_underwater( false );
9755 // TODO: Check whenever it is actually in the viewport
9756 // or maybe even just redraw the changed tiles
9757 bool seen = is_u || u.sees( *c ); // To avoid redrawing when not seen
9758 if( force_next ) {
9759 pt = next_forced;
9760 force_next = false;
9761 } else {
9762 tdir.advance();
9763 pt.x = c->posx() + tdir.dx();
9764 pt.y = c->posy() + tdir.dy();
9765 }
9766 float force = 0;
9767
9768 if( m.obstructed_by_vehicle_rotation( prev_point, pt ) ) {
9769 //We process the intervening tile on this iteration and then the current tile on the next
9770 next_forced = pt;
9771 force_next = true;
9772 if( one_in( 2 ) ) {
9773 pt.x = prev_point.x;
9774 } else {
9775 pt.y = prev_point.y;
9776 }
9777 }
9778
9779
9780 if( monster *const mon_ptr = critter_at<monster>( pt ) ) {
9781 monster &critter = *mon_ptr;
9782 // Approximate critter's "stopping power" with its max hp
9783 force = std::min<float>( 1.5f * critter.type->hp, flvel );
9784 const int damage = rng( force, force * 2.0f ) / 6;
9785 c->impact( damage, pt );
9786 // Multiply zed damage by 6 because no body parts
9787 const int zed_damage = std::max( 0,
9788 ( damage - critter.get_armor_bash( bodypart_id( "torso" ) ) ) * 6 );
9789 // TODO: Pass the "flinger" here - it's not the flung critter that deals damage
9790 critter.apply_damage( c, bodypart_id( "torso" ), zed_damage );
9791 critter.check_dead_state();
9792 if( !critter.is_dead() ) {
9793 thru = false;
9794 }
9795 } else if( m.impassable( pt ) ) {
9796 if( !m.veh_at( pt ).obstacle_at_part() ) {
9797 force = std::min<float>( m.bash_strength( pt ), flvel );
9798 } else {
9799 // No good way of limiting force here
9800 // Keep it 1 less than maximum to make the impact hurt
9801 // but to keep the target flying after it
9802 force = flvel - 1;
9803 }
9804 const int damage = rng( force, force * 2.0f ) / 9;
9805 c->impact( damage, pt );
9806 if( m.is_bashable( pt ) ) {
9807 // Only go through if we successfully make the tile passable
9808 m.bash( pt, flvel );
9809 thru = m.passable( pt );
9810 } else {
9811 thru = false;
9812 }
9813 }
9814
9815 // If the critter dies during flinging, moving it around causes debugmsgs
9816 if( c->is_dead_state() ) {
9817 return;
9818 }
9819
9820 flvel -= force;
9821 if( thru ) {
9822 if( p != nullptr ) {
9823 if( p->in_vehicle ) {
9824 m.unboard_vehicle( p->pos() );
9825 }
9826 // If we're flinging the player around, make sure the map stays centered on them.
9827 if( is_u && !suppress_map_update ) {
9828 update_map( pt.x, pt.y );
9829 } else {
9830 p->setpos( pt );
9831 }
9832 } else if( !critter_at( pt ) ) {
9833 // Dying monster doesn't always leave an empty tile (blob spawning etc.)
9834 // Just don't setpos if it happens - next iteration will do so
9835 // or the monster will stop a tile before the unpassable one
9836 c->setpos( pt );
9837 }
9838 } else {
9839 // Don't zero flvel - count this as slamming both the obstacle and the ground
9840 // although at lower velocity
9841 break;
9842 }
9843 //Vehicle wall tiles don't count for range
9844 if( !force_next ) {
9845 range--;
9846 }
9847 prev_point = pt;
9848 if( animate && ( seen || u.sees( *c ) ) ) {
9853 }
9854 }
9855
9856 // Fall down to the ground - always on the last reached tile
9857 if( !m.has_flag( "SWIMMABLE", c->pos() ) ) {
9858 const trap_id trap_under_creature = m.tr_at( c->pos() ).loadid;
9859 // Didn't smash into a wall or a floor so only take the fall damage
9860 if( thru && trap_under_creature == tr_ledge ) {
9861 m.creature_on_trap( *c, false );
9862 } else {
9863 // Fall on ground
9864 int force = rng( flvel, flvel * 2 ) / 9;
9865 if( controlled ) {
9866 force = std::max( force / 2 - 5, 0 );
9867 }
9868 if( force > 0 ) {
9869 int dmg = c->impact( force, c->pos() );
9870 // TODO: Make landing damage the floor
9871 m.bash( c->pos(), dmg / 4, false, false, false );
9872 }
9873 // Always apply traps to creature i.e. bear traps, tele traps etc.
9874 m.creature_on_trap( *c, false );
9875 }
9876 } else {
9877 c->set_underwater( true );
9878 if( is_u ) {
9879 if( controlled ) {
9880 add_msg( _( "You dive into water." ) );
9881 } else {
9882 add_msg( m_warning, _( "You fall into water." ) );
9883 }
9884 }
9885 }
9886}
void setpos(const tripoint &p) override
Definition: character.h:804
void check_dead_state()
This function checks the creatures is_dead_state and (if true) calls die.
Definition: creature.cpp:1845
point update_map(player &p)
Definition: game.cpp:10611
void pump_events()
Resize & refresh if necessary, process all pending window events, and ignore keypresses.
int bash_strength(const tripoint &p, bool allow_floor=false) const
Returns max_str of the furniture or terrain at p.
Definition: map.cpp:2518
bool obstructed_by_vehicle_rotation(const tripoint &from, const tripoint &to) const
Checks if a rotated vehicle is blocking diagonal movement, tripoints must be adjacent.
Definition: map.cpp:6556
bash_results bash(const tripoint &p, int str, bool silent=false, bool destroy=false, bool bash_floor=false, const vehicle *bashing_vehicle=nullptr)
Returns a pair where first is whether anything was smashed and second is if it was destroyed.
Definition: map.cpp:3585
void unboard_vehicle(const vpart_reference &, Character *passenger, bool dead_passenger=false)
Definition: map.cpp:1139
bool is_bashable(const tripoint &p, bool allow_floor=false) const
Returns true if there is a bashable vehicle part or the furn/terrain is bashable at p.
Definition: map.cpp:2483
void creature_on_trap(Creature &critter, bool may_avoid=true)
Apply trap effects to the creature, similar to creature_in_field.
Definition: map.cpp:8546
bool passable(const tripoint &p) const
Definition: map.cpp:1858
int get_armor_bash(bodypart_id bp) const override
Definition: monster.cpp:1888
bool is_dead() const
Definition: monster.cpp:2786
void apply_damage(Creature *source, bodypart_id bp, int dam, bool bypass_med=false) override
Definition: monster.cpp:1669
cata::optional< vpart_reference > obstacle_at_part() const
Definition: vehicle.cpp:2494
Definition: player.h:84
static const trap_str_id tr_ledge("tr_ledge")
void redraw_invalidated()
Redraw all invalidated windows without invalidating the top window.
Definition: ui_manager.cpp:394
int hp
Definition: mtype.h:270
trap_id loadid
Definition: trap.h:88
int y
Definition: point.h:137
int x
Definition: point.h:136

References _, add_msg(), tileray::advance(), monster::apply_damage(), map::bash(), map::bash_strength(), c, Creature::check_dead_state(), map::creature_on_trap(), critter_at(), debugmsg, tileray::dx(), tileray::dy(), monster::get_armor_bash(), map::has_flag(), mtype::hp, map::impassable(), Character::in_vehicle, inp_mngr, invalidate_main_ui_adaptor(), map::is_bashable(), monster::is_dead(), trap::loadid, m, m_warning, optional_vpart_position::obstacle_at_part(), map::obstructed_by_vehicle_rotation(), one_in(), map::passable(), Character::pos(), input_manager::pump_events(), ui_manager::redraw_invalidated(), refresh_display(), rng(), Character::sees(), Character::setpos(), map::tr_at(), tr_ledge, monster::type, u, map::unboard_vehicle(), update_map(), map::veh_at(), tripoint::x, and tripoint::y.

Referenced by moving_vehicle_dismount().

◆ forced_door_closing()

bool game::forced_door_closing ( const tripoint p,
const ter_id door_type,
int  bash_dmg 
)

Definition at line 4968 of file game.cpp.

4969{
4970 const auto valid_location = [&]( const tripoint & p ) {
4971 return g->is_empty( p );
4972 };
4973 const auto get_random_point = [&]() -> tripoint {
4974 if( auto pos = random_point( m.points_in_radius( p, 2 ), valid_location ) )
4975 {
4976 return p * 2 - ( *pos );
4977 } else
4978 {
4979 return p;
4980 }
4981 };
4982
4983 const std::string &door_name = door_type.obj().name();
4984 const tripoint kbp = get_random_point();
4985
4986 // can't pushback any creatures/items anywhere, that means the door can't close.
4987 const bool cannot_push = kbp == p;
4988 const bool can_see = u.sees( p );
4989
4990 player *npc_or_player = critter_at<player>( p, false );
4991 if( npc_or_player != nullptr ) {
4992 if( bash_dmg <= 0 ) {
4993 return false;
4994 }
4995 if( npc_or_player->is_npc() && can_see ) {
4996 add_msg( _( "The %1$s hits the %2$s." ), door_name, npc_or_player->name );
4997 } else if( npc_or_player->is_player() ) {
4998 add_msg( m_bad, _( "The %s hits you." ), door_name );
4999 }
5000 if( npc_or_player->activity ) {
5001 npc_or_player->cancel_activity();
5002 }
5003 // TODO: make the npc angry?
5004 npc_or_player->hitall( bash_dmg, 0, nullptr );
5005 if( cannot_push ) {
5006 return false;
5007 }
5008 // TODO implement who was closing the door and replace nullptr
5009 knockback( kbp, p, std::max( 1, bash_dmg / 10 ), -1, 1, nullptr );
5010 // TODO: perhaps damage/destroy the gate
5011 // if the npc was really big?
5012 }
5013 if( monster *const mon_ptr = critter_at<monster>( p ) ) {
5014 monster &critter = *mon_ptr;
5015 if( bash_dmg <= 0 ) {
5016 return false;
5017 }
5018 if( can_see ) {
5019 add_msg( _( "The %1$s hits the %2$s." ), door_name, critter.name() );
5020 }
5021 if( critter.type->size <= MS_SMALL ) {
5022 critter.die_in_explosion( nullptr );
5023 } else {
5024 critter.apply_damage( nullptr, bodypart_id( "torso" ), bash_dmg );
5025 critter.check_dead_state();
5026 }
5027 if( !critter.is_dead() && critter.type->size >= MS_HUGE ) {
5028 // big critters simply prevent the gate from closing
5029 // TODO: perhaps damage/destroy the gate
5030 // if the critter was really big?
5031 return false;
5032 }
5033 if( !critter.is_dead() ) {
5034 // Still alive? Move the critter away so the door can close
5035 if( cannot_push ) {
5036 return false;
5037 }
5038 // TODO implement who was closing the door and replace nullptr
5039 knockback( kbp, p, std::max( 1, bash_dmg / 10 ), -1, 1, nullptr );
5040 if( critter_at( p ) ) {
5041 return false;
5042 }
5043 }
5044 }
5045 if( const optional_vpart_position vp = m.veh_at( p ) ) {
5046 if( bash_dmg <= 0 ) {
5047 return false;
5048 }
5049 vp->vehicle().damage( vp->part_index(), bash_dmg );
5050 if( m.veh_at( p ) ) {
5051 // Check again in case all parts at the door tile
5052 // have been destroyed, if there is still a vehicle
5053 // there, the door can not be closed
5054 return false;
5055 }
5056 }
5057 if( bash_dmg < 0 && !m.i_at( p ).empty() ) {
5058 return false;
5059 }
5060 if( bash_dmg == 0 ) {
5061 for( auto &elem : m.i_at( p ) ) {
5062 if( elem.made_of( LIQUID ) ) {
5063 // Liquids are OK, will be destroyed later
5064 continue;
5065 } else if( elem.volume() < 250_ml ) {
5066 // Dito for small items, will be moved away
5067 continue;
5068 }
5069 // Everything else prevents the door from closing
5070 return false;
5071 }
5072 }
5073
5074 m.ter_set( p, door_type );
5075 if( m.has_flag( "NOITEM", p ) ) {
5076 map_stack items = m.i_at( p );
5077 for( map_stack::iterator it = items.begin(); it != items.end(); ) {
5078 if( it->made_of( LIQUID ) ) {
5079 it = items.erase( it );
5080 continue;
5081 }
5082 if( it->made_of( material_id( "glass" ) ) && one_in( 2 ) ) {
5083 if( can_see ) {
5084 add_msg( m_warning, _( "A %s shatters!" ), it->tname() );
5085 } else {
5086 add_msg( m_warning, _( "Something shatters!" ) );
5087 }
5088 it = items.erase( it );
5089 continue;
5090 }
5091 if( cannot_push ) {
5092 return false;
5093 }
5094 m.add_item_or_charges( kbp, *it );
5095 it = items.erase( it );
5096 }
5097 }
5098 return true;
5099}
int hitall(int dam, int vary, Creature *source)
Harms all body parts for dam, with armor reduction.
Definition: character.cpp:8635
void knockback(const tripoint &s, const tripoint &t, int force, int stun, int dam_mult, Creature *source)
Definition: game.cpp:4226
iterator erase(const_iterator it) override
Definition: map.cpp:152
bool ter_set(const tripoint &p, const ter_id &new_terrain)
Definition: map.cpp:1697
void die_in_explosion(Creature *source)
Definition: monster.cpp:1683
bool is_npc() const override
Definition: player.h:103
bool is_player() const override
Definition: player.h:93
@ MS_SMALL
Definition: creature.h:59
@ MS_HUGE
Definition: creature.h:62
@ LIQUID
Definition: enums.h:175
cata::optional< tripoint > random_point(const map &m, const std::function< bool(const tripoint &)> &predicate)
Same as other random_point with a range enclosing all valid points of the map.
std::string name() const
Definition: mapdata.cpp:513
m_size size
Definition: mtype.h:262

References _, Character::activity, map::add_item_or_charges(), add_msg(), monster::apply_damage(), item_stack::begin(), Character::cancel_activity(), Creature::check_dead_state(), critter_at(), monster::die_in_explosion(), item_stack::empty(), item_stack::end(), map_stack::erase(), g, map::has_flag(), Character::hitall(), map::i_at(), monster::is_dead(), player::is_npc(), player::is_player(), knockback(), LIQUID, m, m_bad, m_warning, MS_HUGE, MS_SMALL, Character::name, map_data_common_t::name(), monster::name(), int_id< T >::obj(), one_in(), map::points_in_radius(), random_point(), Character::sees(), mtype::size, map::ter_set(), monster::type, u, and map::veh_at().

◆ gametype()

special_game_id game::gametype ( ) const

Definition at line 535 of file game.cpp.

536{
537 return gamemode ? gamemode->id() : SGAME_NULL;
538}
@ SGAME_NULL
Definition: enums.h:93

References gamemode, and SGAME_NULL.

◆ get_creature_if()

Creature * game::get_creature_if ( const std::function< bool(const Creature &)> &  pred)

Returns a creature matching a predicate.

Only living (not dead) creatures are checked. Returns nullptr if no creature matches the predicate. There is no guarantee which creature is returned when several creatures match.

Definition at line 11959 of file game.cpp.

11960{
11961 for( Creature &critter : all_creatures() ) {
11962 if( pred( critter ) ) {
11963 return &critter;
11964 }
11965 }
11966 return nullptr;
11967}

References all_creatures().

◆ get_creatures_if()

std::vector< Creature * > game::get_creatures_if ( const std::function< bool(const Creature &)> &  pred)

Returns all creatures matching a predicate.

Only living ( not dead ) creatures are checked ( and returned ). Returned pointers are never null.

Definition at line 11869 of file game.cpp.

11871{
11872 std::vector<Creature *> result;
11873 for( Creature &critter : all_creatures() ) {
11874 if( pred( critter ) ) {
11875 result.push_back( &critter );
11876 }
11877 }
11878 return result;
11879}

References all_creatures().

◆ get_cur_om()

overmap & game::get_cur_om ( ) const

The overmap which contains the center submap of the reality bubble.

Definition at line 11849 of file game.cpp.

11850{
11851 // The player is located in the middle submap of the map.
11853 const tripoint pos_om = sm_to_om_copy( sm );
11854 // TODO: fix point types
11855 return overmap_buffer.get( point_abs_om( pos_om.xy() ) );
11856}
tripoint get_abs_sub() const
return abs_sub
Definition: map.cpp:8350
overmap & get(const point_abs_om &)
Uses overmap coordinates, that means x and y are directly compared with the position of the overmap.
point sm_to_om_copy(const point &p)
coords::coord_point< point, coords::origin::abs, coords::om > point_abs_om
Definition: coordinates.h:483
static constexpr int HALF_MAPSIZE
constexpr scale sm
Definition: coordinates.h:31

References overmapbuffer::get(), map::get_abs_sub(), HALF_MAPSIZE, m, overmap_buffer, coords::sm, sm_to_om_copy(), and tripoint::xy().

Referenced by start_game().

◆ get_dangerous_tile()

std::vector< std::string > game::get_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8679 of file game.cpp.

8680{
8681 std::vector<std::string> harmful_stuff;
8682 const auto fields_here = m.field_at( u.pos() );
8683 for( const auto &e : m.field_at( dest_loc ) ) {
8684 // warn before moving into a dangerous field except when already standing within a similar field
8685 if( u.is_dangerous_field( e.second ) && fields_here.find_field( e.first ) == nullptr ) {
8686 harmful_stuff.push_back( e.second.name() );
8687 }
8688 }
8689
8690 if( !u.is_blind() ) {
8691 const trap &tr = m.tr_at( dest_loc );
8692 const bool boardable = static_cast<bool>( m.veh_at( dest_loc ).part_with_feature( "BOARDABLE",
8693 true ) );
8694 // HACK: Hack for now, later ledge should stop being a trap
8695 // Note: in non-z-level mode, ledges obey different rules and so should be handled as regular traps
8696 if( tr.loadid == tr_ledge && m.has_zlevels() ) {
8697 if( !boardable ) {
8698 harmful_stuff.emplace_back( tr.name() );
8699 }
8700 } else if( tr.can_see( dest_loc, u ) && !tr.is_benign() && !boardable ) {
8701 harmful_stuff.emplace_back( tr.name() );
8702 }
8703
8704 static const std::set< body_part > sharp_bps = {
8707 };
8708
8709 const auto sharp_bp_check = [this]( body_part bp ) {
8710 return character_funcs::is_bp_immune_to( u, bp, { DT_CUT, 10 } );
8711 };
8712
8713 if( m.has_flag( "ROUGH", dest_loc ) && !m.has_flag( "ROUGH", u.pos() ) && !boardable &&
8714 ( u.get_armor_bash( bodypart_id( "foot_l" ) ) < 5 ||
8715 u.get_armor_bash( bodypart_id( "foot_r" ) ) < 5 ) ) {
8716 harmful_stuff.emplace_back( m.name( dest_loc ) );
8717 } else if( m.has_flag( "SHARP", dest_loc ) && !m.has_flag( "SHARP", u.pos() ) && !( u.in_vehicle ||
8718 m.veh_at( dest_loc ) ) &&
8719 u.dex_cur < 78 && !std::all_of( sharp_bps.begin(), sharp_bps.end(), sharp_bp_check ) ) {
8720 harmful_stuff.emplace_back( m.name( dest_loc ) );
8721 }
8722
8723 }
8724
8725 return harmful_stuff;
8726}
@ bp_foot_l
Definition: bodypart.h:50
@ bp_leg_r
Definition: bodypart.h:49
@ bp_eyes
Definition: bodypart.h:42
@ bp_hand_l
Definition: bodypart.h:46
@ bp_arm_l
Definition: bodypart.h:44
@ bp_leg_l
Definition: bodypart.h:48
@ bp_hand_r
Definition: bodypart.h:47
@ bp_head
Definition: bodypart.h:41
@ bp_torso
Definition: bodypart.h:40
@ bp_mouth
Definition: bodypart.h:43
@ bp_foot_r
Definition: bodypart.h:51
@ bp_arm_r
Definition: bodypart.h:45
int dex_cur
Definition: character.h:257
int get_armor_bash(bodypart_id bp) const override
Returns overall bashing resistance for the body_part.
Definition: character.cpp:6825
bool is_dangerous_field(const field_entry &entry) const
Returns true if the given field entry is dangerous to us.
Definition: creature.cpp:197
const field & field_at(const tripoint &p) const
Get the fields that are here.
Definition: map.cpp:5360
bool has_zlevels() const
Definition: map.h:1623
cata::optional< vpart_reference > part_with_feature(const std::string &f, bool unbroken) const
Definition: vehicle.cpp:2482
@ DT_CUT
Definition: damage.h:25
bool is_bp_immune_to(const Character &who, body_part bp, damage_unit dam)
Check if character's body part is immune to given damage.
Definition: trap.h:86
std::string name() const
Definition: trap.cpp:177
bool can_see(const tripoint &pos, const Character &p) const
Can player/npc p see this kind of trap, either by their memory (they known there is the trap) or by t...
Definition: trap.cpp:223
bool is_benign() const
If true, this is not really a trap and there won't be any safety queries before stepping onto it (e....
Definition: trap.h:159

References bp_arm_l, bp_arm_r, bp_eyes, bp_foot_l, bp_foot_r, bp_hand_l, bp_hand_r, bp_head, bp_leg_l, bp_leg_r, bp_mouth, bp_torso, trap::can_see(), Character::dex_cur, DT_CUT, map::field_at(), Character::get_armor_bash(), map::has_flag(), map::has_zlevels(), Character::in_vehicle, trap::is_benign(), Character::is_blind(), character_funcs::is_bp_immune_to(), Creature::is_dangerous_field(), trap::loadid, m, trap::name(), map::name(), optional_vpart_position::part_with_feature(), Character::pos(), map::tr_at(), tr_ledge, u, and map::veh_at().

Referenced by is_dangerous_tile(), prompt_dangerous_tile(), and walk_move().

◆ get_fishable_locations()

std::unordered_set< tripoint > game::get_fishable_locations ( int  distance,
const tripoint fish_pos 
)

Get the contiguous fishable locations starting at fish_pos, out to the specificed distance.

Parameters
distanceDistance around the fish_pos to examine for contiguous fishable locations.
fish_posThe location being fished.
Returns
A set of locations representing the valid contiguous fishable locations.

Definition at line 3584 of file game.cpp.

3585{
3586 // We're going to get the contiguous fishable terrain starting at
3587 // the provided fishing location (e.g. where a line was cast or a fish
3588 // trap was set), and then check whether or not fishable monsters are
3589 // actually in those locations. This will help us ensure that we're
3590 // getting our fish from the location that we're ACTUALLY fishing,
3591 // rather than just somewhere in the vicinity.
3592
3593 std::unordered_set<tripoint> visited;
3594
3595 const tripoint fishing_boundary_min( fish_pos + point( -distance, -distance ) );
3596 const tripoint fishing_boundary_max( fish_pos + point( distance, distance ) );
3597
3598 const inclusive_cuboid<tripoint> fishing_boundaries(
3599 fishing_boundary_min, fishing_boundary_max );
3600
3601 const auto get_fishable_terrain = [&]( tripoint starting_point,
3602 std::unordered_set<tripoint> &fishable_terrain ) {
3603 std::queue<tripoint> to_check;
3604 to_check.push( starting_point );
3605 while( !to_check.empty() ) {
3606 const tripoint current_point = to_check.front();
3607 to_check.pop();
3608
3609 // We've been here before, so bail.
3610 if( visited.find( current_point ) != visited.end() ) {
3611 continue;
3612 }
3613
3614 // This point is out of bounds, so bail.
3615 if( !fishing_boundaries.contains( current_point ) ) {
3616 continue;
3617 }
3618
3619 // Mark this point as visited.
3620 visited.emplace( current_point );
3621
3622 if( m.has_flag( "FISHABLE", current_point ) ) {
3623 fishable_terrain.emplace( current_point );
3624 to_check.push( current_point + point_south );
3625 to_check.push( current_point + point_north );
3626 to_check.push( current_point + point_east );
3627 to_check.push( current_point + point_west );
3628 }
3629 }
3630 return;
3631 };
3632
3633 // Starting at the provided location, get our fishable terrain
3634 // and populate a set with those locations which we'll then use
3635 // to determine if any fishable monsters are in those locations.
3636 std::unordered_set<tripoint> fishable_points;
3637 get_fishable_terrain( fish_pos, fishable_points );
3638
3639 return fishable_points;
3640}
static constexpr point point_west
Definition: point.h:268
static constexpr point point_south
Definition: point.h:266
static constexpr point point_north
Definition: point.h:262
static constexpr point point_east
Definition: point.h:264

References inclusive_cuboid< Tripoint, >::contains(), map::has_flag(), m, point_east, point_north, point_south, and point_west.

◆ get_fishable_monsters()

std::vector< monster * > game::get_fishable_monsters ( std::unordered_set< tripoint > &  fishable_locations)

Get the fishable monsters within the provided fishable locations.

Parameters
fishable_locationsA set of locations which are valid fishable terrain. Any fishable monsters are filtered by this collection to determine those which can actually be caught.
Returns
Fishable monsters within the specified fishable terrain.

Definition at line 3642 of file game.cpp.

3644{
3645 std::vector<monster *> unique_fish;
3646 for( monster &critter : all_monsters() ) {
3647 // If it is fishable...
3648 if( critter.has_flag( MF_FISHABLE ) ) {
3649 const tripoint critter_pos = critter.pos();
3650 // ...and it is in a fishable location.
3651 if( fishable_locations.find( critter_pos ) != fishable_locations.end() ) {
3652 unique_fish.push_back( &critter );
3653 }
3654 }
3655 }
3656
3657 return unique_fish;
3658}
@ MF_FISHABLE
Definition: mtype.h:142

References all_monsters(), and MF_FISHABLE.

◆ get_follower_list()

std::set< character_id > game::get_follower_list ( )

Get set of followers.

Definition at line 1966 of file game.cpp.

1967{
1968 return follower_ids;
1969}

References follower_ids.

◆ get_kill_tracker()

const kill_tracker & game::get_kill_tracker ( ) const

Definition at line 876 of file game.cpp.

877{
878 return *kill_tracker_ptr;
879}

References kill_tracker_ptr.

Referenced by cleanup_at_end(), death_screen(), handle_action(), and win().

◆ get_levx()

int game::get_levx ( ) const

The top left corner of the reality bubble (in submaps coordinates).

This is the same as map::abs_sub of the m map.

Definition at line 11834 of file game.cpp.

11835{
11836 return m.get_abs_sub().x;
11837}

References map::get_abs_sub(), m, and tripoint::x.

Referenced by create_starting_npcs(), load_npcs(), look_around(), save_cyborg(), spawn_hallucination(), vertical_move(), and vertical_shift().

◆ get_levy()

int game::get_levy ( ) const

Definition at line 11839 of file game.cpp.

11840{
11841 return m.get_abs_sub().y;
11842}

References map::get_abs_sub(), m, and tripoint::y.

Referenced by create_starting_npcs(), load_npcs(), look_around(), save_cyborg(), spawn_hallucination(), vertical_move(), and vertical_shift().

◆ get_levz()

◆ get_moves_since_last_save()

int game::get_moves_since_last_save ( ) const

Definition at line 7066 of file game.cpp.

7067{
7068 return moves_since_last_save;
7069}

References moves_since_last_save.

◆ get_npcs_if()

std::vector< npc * > game::get_npcs_if ( const std::function< bool(const npc &)> &  pred)

Definition at line 11881 of file game.cpp.

11882{
11883 std::vector<npc *> result;
11884 for( npc &guy : all_npcs() ) {
11885 if( pred( guy ) ) {
11886 result.push_back( &guy );
11887 }
11888 }
11889 return result;
11890}

References all_npcs().

Referenced by allies(), chat(), and validate_npc_followers().

◆ get_player_base_save_path()

std::string game::get_player_base_save_path ( ) const

Base path for saving player data.

Just add a suffix (unique for the thing you want to save) and use the resulting path. Example: save_ui_data(get_player_base_save_path()+".ui")

Definition at line 11969 of file game.cpp.

11970{
11971 return get_world_base_save_path() + "/" + base64_encode( u.name );
11972}
std::string base64_encode(const std::string &str)
std::string get_world_base_save_path() const
Base path for saving world data.
Definition: game.cpp:11974

References base64_encode(), get_world_base_save_path(), Character::name, and u.

Referenced by save_player_data().

◆ get_player_input()

input_context game::get_player_input ( std::string &  action)
private

Definition at line 245 of file handle_action.cpp.

246{
247 input_context ctxt;
248 if( uquit == QUIT_WATCH ) {
249 ctxt = input_context( "DEFAULTMODE" );
250 ctxt.set_iso( true );
251 // The list of allowed actions in death-cam mode in game::handle_action
252 // *INDENT-OFF*
253 for( const action_id id : {
266 } ) {
267 ctxt.register_action( action_ident( id ) );
268 }
269 // *INDENT-ON*
270 ctxt.register_action( "QUIT", to_translation( "Accept your fate" ) );
271 } else {
273 }
274
276
277 user_turn current_turn;
278
279
280 // Checking early if we will need to handle animations
281 // If we do not need to handle animations that will not change as long as the user has not selected an action
282 // and we can handle it like we are not animating.
283 weather_printable wPrint;
284 bool animate_weather = false;
285 bool animate_sct = false;
286 bool do_animations = [&]() {
287 if( get_option<bool>( "ANIMATIONS" ) ) {
288 const bool weather_has_anim = init_weather_anim( get_weather().weather_id, wPrint );
289
290 animate_weather = weather_has_anim && get_option<bool>( "ANIMATION_RAIN" );
291 animate_sct = !SCT.vSCT.empty() && uquit != QUIT_WATCH && get_option<bool>( "ANIMATION_SCT" );
292
293#if defined(TILES)
294 // Always animate, minimap and terrain may have animations to run
295 return true;
296#else
297 // Otherwise we need to see if we actually should animate.
298 // Minimap and Terrain never animate in !TILES
299 return animate_weather || animate_sct || uquit == QUIT_WATCH;
300#endif
301 }
302 return false;
303 }
304 ();
305
306 if( do_animations ) {
307 ctxt.set_timeout( 125 );
308
310 make_shared_fast<game::draw_callback_t>( [&]() {
311 if( animate_weather ) {
312 draw_weather( wPrint );
313 }
314 if( animate_sct ) {
315 draw_sct();
316 }
317 } );
318 add_draw_callback( animation_cb );
319 invalidate_main_ui_adaptor(); // We want to redraw at least once.
320
321 do {
322 if( animate_weather ) {
324 generate_weather_anim_frame( get_weather().weather_id, wPrint );
325 }
326 // don't bother calculating SCT if we won't show it
327 if( animate_sct ) {
329
331
332 //Check for creatures on all drawing positions and offset if necessary
333 for( auto iter = SCT.vSCT.rbegin(); iter != SCT.vSCT.rend(); ++iter ) {
334 const direction oCurDir = iter->getDirecton();
335 const int width = utf8_width( iter->getText() );
336 for( int i = 0; i < width; ++i ) {
337 tripoint tmp( iter->getPosX() + i, iter->getPosY(), get_levz() );
338 const Creature *critter = critter_at( tmp, true );
339
340 if( critter != nullptr && u.sees( *critter ) ) {
341 i = -1;
342 int iPos = iter->getStep() + iter->getStepOffset();
343 for( auto iter2 = iter; iter2 != SCT.vSCT.rend(); ++iter2 ) {
344 if( iter2->getDirecton() == oCurDir &&
345 iter2->getStep() + iter2->getStepOffset() <= iPos ) {
346 if( iter2->getType() == "hp" ) {
347 iter2->advanceStepOffset();
348 }
349
350 iter2->advanceStepOffset();
351 iPos = iter2->getStep() + iter2->getStepOffset();
352 }
353 }
354 }
355 }
356 }
357
358 // Stop animation when done
359 animate_sct = !SCT.vSCT.empty();
360 }
361 // We don't cache these checks as their result may change after 1st redraw
363 // TODO: we redraw *everything* just to animate a couple blinking dots
364 // on the minimap or a few tiles.
365 // This is far from ideal, and can probably be done much cheaper
366 // (update only part of the screen? draw static parts into a texture?)
368 }
369
370 std::unique_ptr<static_popup> deathcam_msg_popup;
371 if( uquit == QUIT_WATCH ) {
372 deathcam_msg_popup = std::make_unique<static_popup>();
373 deathcam_msg_popup
374 ->wait_message( c_red, _( "Press %s to accept your fate…" ), ctxt.get_desc( "QUIT" ) )
375 .on_top( true );
376 }
377
379 } while( handle_mouseview( ctxt, action ) && uquit != QUIT_WATCH
380 && ( action != "TIMEOUT" || !current_turn.has_timeout_elapsed() ) );
381 ctxt.reset_timeout();
382 } else {
385 SCT.vSCT.clear();
386
387 ctxt.set_timeout( 125 );
388 while( handle_mouseview( ctxt, action ) ) {
389 if( action == "TIMEOUT" && current_turn.has_timeout_elapsed() ) {
390 break;
391 }
392 }
393 ctxt.reset_timeout();
394 }
395
396 return ctxt;
397}
std::string action_ident(action_id act)
Lookup a unique string identifier for a given action ID.
Definition: action.cpp:68
action_id
Enumerates all discrete actions that can be performed by player.
Definition: action.h:22
@ ACTION_CENTER
Center the viewport on character.
Definition: action.h:77
@ ACTION_SHIFT_SW
Move viewport south-west.
Definition: action.h:89
@ ACTION_SHIFT_NW
Move viewport north-west.
Definition: action.h:93
@ ACTION_KEYBINDINGS
Display keybindings list.
Definition: action.h:259
@ ACTION_SHIFT_E
Move viewport east.
Definition: action.h:83
@ ACTION_TOGGLE_MAP_MEMORY
Toggle memorized tiles being shown.
Definition: action.h:75
@ ACTION_SHIFT_S
Move viewport south.
Definition: action.h:87
@ ACTION_SHIFT_SE
Move viewport south-east.
Definition: action.h:85
@ ACTION_LOOK
Toggle look mode.
Definition: action.h:119
@ ACTION_SHIFT_NE
Move viewport north-east.
Definition: action.h:81
@ ACTION_SHIFT_W
Move viewport west.
Definition: action.h:91
@ ACTION_SHIFT_N
Move viewport north.
Definition: action.h:79
bool terrain_requires_animation()
Definition: animation.cpp:1144
bool minimap_requires_animation()
Definition: animation.cpp:1135
void draw_sct()
Definition: animation.cpp:805
void draw_weather(const weather_printable &wPrint)
Definition: animation.cpp:764
void add_draw_callback(shared_ptr_fast< draw_callback_t > cb)
Definition: game.cpp:2997
bool handle_mouseview(input_context &ctxt, std::string &action)
Definition: game.cpp:1997
void set_timeout(int val)
Sets input polling timeout as appropriate for the current interface system.
Definition: input.cpp:1458
std::string get_desc(const std::string &action_descriptor, unsigned int max_limit=0, const input_event_filter &evt_filter=allow_all_keys) const
Get a description text for the key/other input method associated with the given action.
Definition: input.cpp:756
void register_action(const std::string &action_descriptor)
Register an action with this input context.
Definition: input.cpp:676
void set_iso(bool mode=true)
Definition: input.cpp:1429
void reset_timeout()
Definition: input.cpp:1463
std::vector< cSCT > vSCT
Definition: output.h:916
void advanceAllSteps()
Definition: output.cpp:1924
bool has_timeout_elapsed()
input_context get_default_mode_input_context()
Definition: game.cpp:2097
static bool init_weather_anim(const weather_type_id &wtype, weather_printable &wPrint)
static void generate_weather_anim_frame(const weather_type_id &wtype, weather_printable &wPrint)
direction
Definition: line.h:39
scrollingcombattext SCT
Definition: output.cpp:65
Weather drawing tracking.
Definition: weather.h:59
translation to_translation(const std::string &raw)
Shorthands for translation::to_translation.

References _, action, ACTION_CENTER, action_ident(), ACTION_KEYBINDINGS, ACTION_LOOK, ACTION_SHIFT_E, ACTION_SHIFT_N, ACTION_SHIFT_NE, ACTION_SHIFT_NW, ACTION_SHIFT_S, ACTION_SHIFT_SE, ACTION_SHIFT_SW, ACTION_SHIFT_W, ACTION_TOGGLE_MAP_MEMORY, add_draw_callback(), scrollingcombattext::advanceAllSteps(), c_red, critter_at(), draw_sct(), draw_weather(), generate_weather_anim_frame(), get_default_mode_input_context(), input_context::get_desc(), get_levz(), get_weather, handle_mouseview(), user_turn::has_timeout_elapsed(), init_weather_anim(), invalidate_main_ui_adaptor(), m, minimap_requires_animation(), Character::posz(), QUIT_WATCH, ui_manager::redraw_invalidated(), input_context::register_action(), input_context::reset_timeout(), SCT, Character::sees(), input_context::set_iso(), input_context::set_timeout(), terrain_requires_animation(), to_translation(), u, map::update_visibility_cache(), uquit, utf8_width(), and scrollingcombattext::vSCT.

Referenced by handle_action().

◆ get_seed()

unsigned int game::get_seed ( ) const

Definition at line 1778 of file game.cpp.

1779{
1780 return seed;
1781}

References seed.

◆ get_user_action_counter()

int game::get_user_action_counter ( ) const

Definition at line 7071 of file game.cpp.

7072{
7073 return user_action_counter;
7074}

References user_action_counter.

◆ get_veh_dir_indicator_location()

cata::optional< tripoint > game::get_veh_dir_indicator_location ( bool  next) const

Returns the location where the indicator should go relative to the reality bubble, or nothing to indicate no indicator should be drawn.

Based on the vehicle the player is driving, if any.

Parameters
nextIf true, bases it on the vehicle the vehicle will turn to next turn, instead of the one it is currently facing.

Definition at line 3252 of file game.cpp.

3253{
3254 if( !get_option<bool>( "VEHICLE_DIR_INDICATOR" ) ) {
3255 return cata::nullopt;
3256 }
3257 const optional_vpart_position vp = m.veh_at( u.pos() );
3258 if( !vp ) {
3259 return cata::nullopt;
3260 }
3261 vehicle *const veh = &vp->vehicle();
3262 rl_vec2d face = next ? veh->dir_vec() : veh->face_vec();
3263 float r = 10.0;
3264 return tripoint( static_cast<int>( r * face.x ), static_cast<int>( r * face.y ), u.pos().z );
3265}
rl_vec2d dir_vec() const

References vehicle::dir_vec(), vehicle::face_vec(), m, cata::nullopt, Character::pos(), u, map::veh_at(), rl_vec2d::x, rl_vec2d::y, and tripoint::z.

Referenced by draw_veh_dir_indicator().

◆ get_world_base_save_path()

std::string game::get_world_base_save_path ( ) const

Base path for saving world data.

This yields a path to a folder.

Definition at line 11974 of file game.cpp.

11975{
11976 if( world_generator->active_world == nullptr ) {
11977 return PATH_INFO::savedir();
11978 }
11979 return world_generator->active_world->folder_path();
11980}
std::string savedir()
Definition: path_info.cpp:254

References PATH_INFO::savedir(), and world_generator.

Referenced by get_player_base_save_path(), load(), load_master(), move_save_to_graveyard(), save(), save_artifacts(), save_factions_missions_npcs(), and setup().

◆ get_zoom()

int game::get_zoom ( ) const

Definition at line 7057 of file game.cpp.

7058{
7059#if defined(TILES)
7060 return tileset_zoom;
7061#else
7062 return DEFAULT_TILESET_ZOOM;
7063#endif
7064}

References DEFAULT_TILESET_ZOOM, and tileset_zoom.

Referenced by look_around().

◆ grabbed_furn_move()

bool game::grabbed_furn_move ( const tripoint dp)
private
Strength determines ability to drag furniture

Definition at line 9482 of file game.cpp.

9483{
9484 // Furniture: pull, push, or standing still and nudging object around.
9485 // Can push furniture out of reach.
9486 tripoint fpos = u.pos() + u.grab_point;
9487 // supposed position of grabbed furniture
9488 if( !m.has_furn( fpos ) ) {
9489 // Where did it go? We're grabbing thin air so reset.
9490 add_msg( m_info, _( "No furniture at grabbed point." ) );
9491 u.grab( OBJECT_NONE );
9492 return false;
9493 }
9494
9495 const bool pushing_furniture = dp == u.grab_point;
9496 const bool pulling_furniture = dp == -u.grab_point;
9497 const bool shifting_furniture = !pushing_furniture && !pulling_furniture;
9498
9499 tripoint fdest = fpos + dp; // intended destination of furniture.
9500 // Check floor: floorless tiles don't need to be flat and have no traps
9501 const bool has_floor = m.has_floor( fdest );
9502 // Unfortunately, game::is_empty fails for tiles we're standing on,
9503 // which will forbid pulling, so:
9504 const bool canmove = (
9505 m.passable( fdest ) &&
9506 critter_at<npc>( fdest ) == nullptr &&
9507 critter_at<monster>( fdest ) == nullptr &&
9508 ( !pulling_furniture || is_empty( u.pos() + dp ) ) &&
9509 ( !has_floor || m.has_flag( "FLAT", fdest ) ) &&
9510 !m.has_furn( fdest ) &&
9511 !m.veh_at( fdest ) &&
9512 ( !has_floor || m.tr_at( fdest ).is_null() )
9513 );
9514
9515 const furn_t furntype = m.furn( fpos ).obj();
9516 const int src_items = m.i_at( fpos ).size();
9517 const int dst_items = m.i_at( fdest ).size();
9518
9519 const bool only_liquid_items = std::all_of( m.i_at( fdest ).begin(), m.i_at( fdest ).end(),
9520 [&]( item & liquid_item ) {
9521 return liquid_item.made_of( LIQUID );
9522 } );
9523
9524 const bool dst_item_ok = !m.has_flag( "NOITEM", fdest ) &&
9525 !m.has_flag( "SWIMMABLE", fdest ) &&
9526 !m.has_flag( "DESTROY_ITEM", fdest );
9527
9528 const bool src_item_ok = m.furn( fpos ).obj().has_flag( "CONTAINER" ) ||
9529 m.furn( fpos ).obj().has_flag( "FIRE_CONTAINER" ) ||
9530 m.furn( fpos ).obj().has_flag( "SEALED" );
9531
9532 const int fire_intensity = m.get_field_intensity( fpos, fd_fire );
9533 time_duration fire_age = m.get_field_age( fpos, fd_fire );
9534
9535 int str_req = furntype.move_str_req;
9536 // Factor in weight of items contained in the furniture.
9537 units::mass furniture_contents_weight = 0_gram;
9538 for( auto &contained_item : m.i_at( fpos ) ) {
9539 furniture_contents_weight += contained_item.weight();
9540 }
9541 str_req += furniture_contents_weight / 4_kilogram;
9542 if( !canmove ) {
9543 // TODO: What is something?
9544 add_msg( _( "The %s collides with something." ), furntype.name() );
9545 u.moves -= 50;
9546 return true;
9547 ///\EFFECT_STR determines ability to drag furniture
9548 } else if( str_req > u.get_str() &&
9549 one_in( std::max( 20 - str_req - u.get_str(), 2 ) ) ) {
9550 add_msg( m_bad, _( "You strain yourself trying to move the heavy %s!" ),
9551 furntype.name() );
9552 u.moves -= 100;
9553 u.mod_pain( 1 ); // Hurt ourselves.
9554 return true; // furniture and or obstacle wins.
9555 } else if( !src_item_ok && !only_liquid_items && dst_items > 0 ) {
9556 add_msg( _( "There's stuff in the way." ) );
9557 u.moves -= 50;
9558 return true;
9559 }
9560
9561 u.moves -= str_req * 10;
9562 // Additional penalty if we can't comfortably move it.
9563 if( str_req > u.get_str() ) {
9564 int move_penalty = std::pow( str_req, 2.0 ) + 100.0;
9565 if( move_penalty <= 1000 ) {
9566 if( u.get_str() >= str_req - 3 ) {
9567 u.moves -= std::max( 3000, move_penalty * 10 );
9568 add_msg( m_bad, _( "The %s is really heavy!" ), furntype.name() );
9569 if( one_in( 3 ) ) {
9570 add_msg( m_bad, _( "You fail to move the %s." ), furntype.name() );
9571 return true;
9572 }
9573 } else {
9574 u.moves -= 100;
9575 add_msg( m_bad, _( "The %s is too heavy for you to budge." ), furntype.name() );
9576 return true;
9577 }
9578 }
9579 u.moves -= move_penalty;
9580 if( move_penalty > 500 ) {
9581 add_msg( _( "Moving the heavy %s is taking a lot of time!" ),
9582 furntype.name() );
9583 } else if( move_penalty > 200 ) {
9584 if( one_in( 3 ) ) { // Nag only occasionally.
9585 add_msg( _( "It takes some time to move the heavy %s." ),
9586 furntype.name() );
9587 }
9588 }
9589 }
9591 _( "a scraping noise." ), true, "misc", "scraping" );
9592
9594 ( tripoint_abs_ms( m.getabs( fpos ) ) );
9595
9596 // Actually move the furniture.
9597 m.furn_set( fdest, m.furn( fpos ), atd ? atd->clone() : nullptr );
9598 m.furn_set( fpos, f_null );
9599
9600 if( fire_intensity == 1 && !pulling_furniture ) {
9601 m.remove_field( fpos, fd_fire );
9602 m.set_field_intensity( fdest, fd_fire, fire_intensity );
9603 m.set_field_age( fdest, fd_fire, fire_age );
9604 }
9605
9606 // Is there is only liquids on the ground, remove them after moving furniture.
9607 if( dst_items > 0 && only_liquid_items ) {
9608 m.i_clear( fdest );
9609 }
9610
9611 if( src_items > 0 ) { // Move the stuff inside.
9612 if( dst_item_ok && src_item_ok ) {
9613 // Assume contents of both cells are legal, so we can just swap contents.
9614 std::list<item> temp;
9615 std::move( m.i_at( fpos ).begin(), m.i_at( fpos ).end(),
9616 std::back_inserter( temp ) );
9617 m.i_clear( fpos );
9618 for( auto item_iter = m.i_at( fdest ).begin();
9619 item_iter != m.i_at( fdest ).end(); ++item_iter ) {
9620 m.i_at( fpos ).insert( *item_iter );
9621 }
9622 m.i_clear( fdest );
9623 for( auto &cur_item : temp ) {
9624 m.i_at( fdest ).insert( cur_item );
9625 }
9626 } else {
9627 add_msg( _( "Stuff spills from the %s!" ), furntype.name() );
9628 }
9629 }
9630
9631 if( shifting_furniture ) {
9632 // We didn't move
9633 tripoint d_sum = u.grab_point + dp;
9634 if( std::abs( d_sum.x ) < 2 && std::abs( d_sum.y ) < 2 ) {
9635 u.grab_point = d_sum; // furniture moved relative to us
9636 } else { // we pushed furniture out of reach
9637 add_msg( _( "You let go of the %s." ), furntype.name() );
9638 u.grab( OBJECT_NONE );
9639 }
9640 return true; // We moved furniture but stayed still.
9641 }
9642
9643 if( pushing_furniture && m.impassable( fpos ) ) {
9644 // Not sure how that chair got into a wall, but don't let player follow.
9645 add_msg( _( "You let go of the %1$s as it slides past %2$s." ),
9646 furntype.name(), m.tername( fdest ) );
9647 u.grab( OBJECT_NONE );
9648 return true;
9649 }
9650
9651 return false;
9652}
virtual int get_str() const
Getters for stats exclusive to characters.
Definition: character.cpp:4052
virtual active_tile_data * clone() const =0
void grab(object_type grab_type, const tripoint &grab_point=tripoint_zero)
Definition: avatar.cpp:664
bool is_empty(const tripoint &p)
Returns true if there is no player, NPC, or monster on the tile and move_cost > 0.
Definition: game.cpp:4802
void insert(const item &newitem) override
Definition: map.cpp:157
void remove_field(const tripoint &p, const field_type_id &field_to_remove)
Remove field entry at xy, ignored if the field entry is not present.
Definition: map.cpp:5526
time_duration set_field_age(const tripoint &p, const field_type_id &type, const time_duration &age, bool isoffset=false)
Set age of field entry at point.
Definition: map.cpp:5400
time_duration get_field_age(const tripoint &p, const field_type_id &type) const
Get the age of a field entry (field_entry::age), if there is no field of that type,...
Definition: map.cpp:5434
int get_field_intensity(const tripoint &p, const field_type_id &type) const
Get the intensity of a field entry (field_entry::intensity), if there is no field of that type,...
Definition: map.cpp:5440
int set_field_intensity(const tripoint &p, const field_type_id &type, int new_intensity, bool isoffset=false)
Set intensity of field entry at point, creating if not present, removing if intensity becomes 0.
Definition: map.cpp:5413
std::string tername(const tripoint &p) const
Definition: map.cpp:1767
void i_clear(const tripoint &p)
Definition: map.cpp:4187
void furn_set(const tripoint &p, const furn_id &new_furniture, cata::poly_serialized< active_tile_data > new_active=nullptr)
Sets the furniture at given position.
Definition: map.cpp:1418
bool has_floor(const tripoint &p) const
Definition: map.cpp:2065
tripoint grab_point
Definition: player.h:235
coords::coord_point< tripoint, coords::origin::abs, coords::ms > tripoint_abs_ms
Definition: coordinates.h:486
@ OBJECT_NONE
Definition: enums.h:187
field_type_id fd_fire
Definition: field_type.cpp:345
furn_id f_null
Definition: mapdata.cpp:1097
template active_tile_data * furn_at< active_tile_data >(const tripoint_abs_ms &)
bool move(avatar &you, map &m, const tripoint &d)
void sound(const tripoint &p, int vol, sound_t category, const std::string &description, bool ambient=false, const std::string &id="", const std::string &variant="default")
Sound at (p) of intensity (vol)
Definition: sounds.cpp:177
int move_str_req
Definition: mapdata.h:515
bool has_flag(const std::string &flag) const
Definition: mapdata.h:419

References _, add_msg(), item_stack::begin(), active_tile_data::clone(), item_stack::end(), f_null, fd_fire, map::furn(), active_tiles::furn_at< active_tile_data >(), map::furn_set(), map::get_field_age(), map::get_field_intensity(), Character::get_str(), map::getabs(), avatar::grab(), player::grab_point, map_data_common_t::has_flag(), map::has_flag(), map::has_floor(), map::has_furn(), map::i_at(), map::i_clear(), map::impassable(), map_stack::insert(), is_empty(), trap::is_null(), m, m_bad, m_info, Character::mod_pain(), avatar_action::move(), furn_t::move_str_req, sounds::movement, Creature::moves, map_data_common_t::name(), int_id< T >::obj(), OBJECT_NONE, one_in(), map::passable(), Character::pos(), map::remove_field(), map::set_field_age(), map::set_field_intensity(), item_stack::size(), sounds::sound(), map::tername(), map::tr_at(), u, map::veh_at(), tripoint::x, and tripoint::y.

Referenced by grabbed_move().

◆ grabbed_move()

bool game::grabbed_move ( const tripoint dp)
private

Check for dangerous stuff at dest_loc, return false if the player decides not to step there.

Definition at line 9654 of file game.cpp.

9655{
9656 if( u.get_grab_type() == OBJECT_NONE ) {
9657 return false;
9658 }
9659
9660 if( dp.z != 0 ) {
9661 // No dragging stuff up/down stairs yet!
9662 return false;
9663 }
9664
9665 // vehicle: pulling, pushing, or moving around the grabbed object.
9666 if( u.get_grab_type() == OBJECT_VEHICLE ) {
9667 return grabbed_veh_move( dp );
9668 }
9669
9670 if( u.get_grab_type() == OBJECT_FURNITURE ) {
9671 return grabbed_furn_move( dp );
9672 }
9673
9674 add_msg( m_info, _( "Nothing at grabbed point %d,%d,%d or bad grabbed object type." ),
9676 u.grab( OBJECT_NONE );
9677 return false;
9678}
object_type get_grab_type() const
Definition: avatar.cpp:672
bool grabbed_furn_move(const tripoint &dp)
Definition: game.cpp:9482
bool grabbed_veh_move(const tripoint &dp)
Definition: grab.cpp:21
@ OBJECT_FURNITURE
Definition: enums.h:197
@ OBJECT_VEHICLE
Definition: enums.h:193

References _, add_msg(), avatar::get_grab_type(), avatar::grab(), player::grab_point, grabbed_furn_move(), grabbed_veh_move(), m_info, OBJECT_FURNITURE, OBJECT_NONE, OBJECT_VEHICLE, u, tripoint::x, tripoint::y, and tripoint::z.

Referenced by walk_move().

◆ grabbed_veh_move()

bool game::grabbed_veh_move ( const tripoint dp)
private
Strength determines ability to drag vehicles Strength increases speed of dragging vehicles

Definition at line 21 of file grab.cpp.

22{
23 const optional_vpart_position grabbed_vehicle_vp = m.veh_at( u.pos() + u.grab_point );
24 if( !grabbed_vehicle_vp ) {
25 add_msg( m_info, _( "No vehicle at grabbed point." ) );
27 return false;
28 }
29 vehicle *grabbed_vehicle = &grabbed_vehicle_vp->vehicle();
30 if( !grabbed_vehicle ||
31 !grabbed_vehicle->handle_potential_theft( u ) ) {
32 return false;
33 }
34 const int grabbed_part = grabbed_vehicle_vp->part_index();
35 for( int part_index = 0; part_index < grabbed_vehicle->part_count(); ++part_index ) {
36 monster *mon = grabbed_vehicle->get_pet( part_index );
37 if( mon != nullptr && mon->has_effect( effect_harnessed ) ) {
38 add_msg( m_info, _( "You cannot move this vehicle whilst your %s is harnessed!" ),
39 mon->get_name() );
41 return false;
42 }
43 }
44 const vehicle *veh_under_player = veh_pointer_or_null( m.veh_at( u.pos() ) );
45 if( grabbed_vehicle == veh_under_player ) {
46 u.grab_point = -dp;
47 return false;
48 }
49
50 tripoint dp_veh = -u.grab_point;
51 const tripoint prev_grab = u.grab_point;
52 tripoint next_grab = u.grab_point;
53
54 bool zigzag = false;
55
56 if( dp == prev_grab ) {
57 // We are pushing in the direction of vehicle
58 dp_veh = dp;
59 } else if( std::abs( dp.x + dp_veh.x ) != 2 && std::abs( dp.y + dp_veh.y ) != 2 ) {
60 // Not actually moving the vehicle, don't do the checks
61 u.grab_point = -( dp + dp_veh );
62 return false;
63 } else if( ( dp.x == prev_grab.x || dp.y == prev_grab.y ) &&
64 next_grab.x != 0 && next_grab.y != 0 ) {
65 // Zig-zag (or semi-zig-zag) pull: player is diagonal to vehicle
66 // and moves away from it, but not directly away
67 dp_veh.x = dp.x == -dp_veh.x ? 0 : dp_veh.x;
68 dp_veh.y = dp.y == -dp_veh.y ? 0 : dp_veh.y;
69
70 next_grab = -dp_veh;
71 zigzag = true;
72 } else {
73 // We are pulling the vehicle
74 next_grab = -dp;
75 }
76
77 // Make sure the mass and pivot point are correct
78 grabbed_vehicle->invalidate_mass();
79
80 //vehicle movement: strength check
81 int mc = 0;
82 int str_req = grabbed_vehicle->total_mass() / 25_kilogram; //strength required to move vehicle.
83
84 //if vehicle is rollable we modify str_req based on a function of movecost per wheel.
85
86 // Vehicle just too big to grab & move; 41-45 lets folks have a bit of a window
87 // (Roughly 1.1K kg = danger zone; cube vans are about the max)
88 if( str_req > 45 ) {
89 add_msg( m_info, _( "The %s is too bulky for you to move by hand." ),
90 grabbed_vehicle->name );
91 return true; // No shoving around an RV.
92 }
93
94 const auto &wheel_indices = grabbed_vehicle->wheelcache;
95 if( grabbed_vehicle->valid_wheel_config() ) {
96 //determine movecost for terrain touching wheels
97 const tripoint vehpos = grabbed_vehicle->global_pos3();
98 for( int p : wheel_indices ) {
99 const tripoint wheel_pos = vehpos + grabbed_vehicle->part( p ).precalc[0];
100 const int mapcost = m.move_cost( wheel_pos, grabbed_vehicle );
101 mc += str_req / wheel_indices.size() * mapcost;
102 }
103 //set strength check threshold
104 //if vehicle has many or only one wheel (shopping cart), it is as if it had four.
105 if( wheel_indices.size() > 4 || wheel_indices.size() == 1 ) {
106 str_req = mc / 4 + 1;
107 } else {
108 str_req = mc / wheel_indices.size() + 1;
109 }
110 } else {
111 str_req++;
112 //if vehicle has no wheels str_req make a noise.
113 if( str_req <= u.get_str() ) {
114 sounds::sound( grabbed_vehicle->global_pos3(), str_req * 2, sounds::sound_t::movement,
115 _( "a scraping noise." ), true, "misc", "scraping" );
116 }
117 }
118
119 //final strength check and outcomes
120 ///\EFFECT_STR determines ability to drag vehicles
121 if( str_req <= u.get_str() ) {
122 //calculate exertion factor and movement penalty
123 ///\EFFECT_STR increases speed of dragging vehicles
124 u.moves -= 100 * str_req / std::max( 1, u.get_str() );
125 const int ex = dice( 1, 3 ) - 1 + str_req;
126 if( ex > u.get_str() + 1 ) {
127 // Pain and movement penalty if exertion exceeds character strength
128 add_msg( m_bad, _( "You strain yourself to move the %s!" ), grabbed_vehicle->name );
129 u.moves -= 200;
130 u.mod_pain( 1 );
131 } else if( ex >= u.get_str() ) {
132 // Movement is slow if exertion nearly equals character strength
133 add_msg( _( "It takes some time to move the %s." ), grabbed_vehicle->name );
134 u.moves -= 200;
135 }
136 } else {
137 u.moves -= 100;
138 add_msg( m_bad, _( "You lack the strength to move the %s" ), grabbed_vehicle->name );
139 return true;
140 }
141
142 std::string blocker_name = _( "errors in movement code" );
143 const auto get_move_dir = [&]( const tripoint & dir, const tripoint & from ) {
144 tileray mdir;
145
146 mdir.init( dir.xy() );
147 grabbed_vehicle->turn( mdir.dir() - grabbed_vehicle->face.dir() );
148 grabbed_vehicle->face = grabbed_vehicle->turn_dir;
149 grabbed_vehicle->precalc_mounts( 1, mdir.dir(), grabbed_vehicle->pivot_point() );
150
151 // Grabbed part has to stay at distance 1 to the player
152 // and in roughly the same direction.
153 const tripoint new_part_pos = grabbed_vehicle->global_pos3() +
154 grabbed_vehicle->part( grabbed_part ).precalc[ 1 ];
155 const tripoint expected_pos = u.pos() + dp + from;
156 const tripoint actual_dir = expected_pos - new_part_pos;
157
158 grabbed_vehicle->adjust_zlevel( 1, dp );
159
160 // Set player location to illegal value so it can't collide with vehicle.
161 const tripoint player_prev = u.pos();
163 std::vector<veh_collision> colls;
164 const bool failed = grabbed_vehicle->collision( colls, actual_dir, true );
165 u.setpos( player_prev );
166 if( !colls.empty() ) {
167 blocker_name = colls.front().target_name;
168 }
169 return failed ? tripoint_zero : actual_dir;
170 };
171
172 // First try the move as intended
173 // But if that fails and the move is a zig-zag, try to recover:
174 // Try to place the vehicle in the position player just left rather than "flattening" the zig-zag
175 tripoint final_dp_veh = get_move_dir( dp_veh, next_grab );
176 if( final_dp_veh == tripoint_zero && zigzag ) {
177 final_dp_veh = get_move_dir( -prev_grab, -dp );
178 next_grab = -dp;
179 }
180
181 if( final_dp_veh == tripoint_zero ) {
182 add_msg( _( "The %s collides with %s." ), grabbed_vehicle->name, blocker_name );
183 u.grab_point = prev_grab;
184 return true;
185 }
186
187 u.grab_point = next_grab;
188
189 m.displace_vehicle( *grabbed_vehicle, final_dp_veh );
190
191 if( grabbed_vehicle ) {
192 grabbed_vehicle->shift_zlevel();
193 grabbed_vehicle->check_falling_or_floating();
194 } else {
195 debugmsg( "Grabbed vehicle disappeared" );
196 return false;
197 }
198
199 for( int p : wheel_indices ) {
200 if( one_in( 2 ) ) {
201 tripoint wheel_p = grabbed_vehicle->global_part_pos3( grabbed_part );
202 grabbed_vehicle->handle_trap( wheel_p, p );
203 }
204 }
205
206 return false;
207
208}
bool displace_vehicle(vehicle &veh, const tripoint &dp)
Definition: map.cpp:1177
int move_cost(const tripoint &p, const vehicle *ignored_vehicle=nullptr) const
Calculate the cost to move past the tile at p.
Definition: map.cpp:1838
units::angle dir() const
Definition: tileray.cpp:74
void init(const point &ad)
Definition: tileray.cpp:27
void turn(units::angle deg)
const point & pivot_point() const
Definition: vehicle.cpp:5828
void adjust_zlevel(int idir=0, const tripoint &offset=tripoint_zero)
tripoint global_pos3() const
Definition: vehicle.cpp:3282
void precalc_mounts(int idir, units::angle dir, const point &pivot)
Definition: vehicle.cpp:3151
bool valid_wheel_config() const
Definition: vehicle.cpp:4461
units::mass total_mass() const
Definition: vehicle.cpp:3307
std::vector< int > wheelcache
Definition: vehicle.h:1843
void check_falling_or_floating()
tileray face
Definition: vehicle.h:1973
void invalidate_mass()
Mark mass caches and pivot cache as dirty.
Definition: vehicle.cpp:6972
int part_count() const
Definition: vehicle.cpp:7079
bool collision(std::vector< veh_collision > &colls, const tripoint &dp, bool just_detect, bool bash_floor=false)
monster * get_pet(int p) const
Definition: vehicle.cpp:3263
vehicle_part & part(int part_num)
Definition: vehicle.cpp:7084
void handle_trap(const tripoint &p, int part)
tripoint global_part_pos3(const int &index) const
Get the coordinates of the studied part of the vehicle.
Definition: vehicle.cpp:3287
void shift_zlevel()
units::angle turn_dir
Definition: vehicle.h:1952
static const efftype_id effect_harnessed("harnessed")
static constexpr tripoint tripoint_zero
Definition: point.h:259
int dice(int number, int sides)
Definition: rng.cpp:85
std::array< tripoint, 2 > precalc
mount translated to face.dir [0] and turn_dir [1]
Definition: vehicle.h:372

References _, add_msg(), vehicle::adjust_zlevel(), vehicle::check_falling_or_floating(), vehicle::collision(), debugmsg, dice(), tileray::dir(), map::displace_vehicle(), effect_harnessed, vehicle::face, failed, monster::get_name(), vehicle::get_pet(), Character::get_str(), vehicle::global_part_pos3(), vehicle::global_pos3(), avatar::grab(), player::grab_point, vehicle::handle_potential_theft(), vehicle::handle_trap(), Creature::has_effect(), tileray::init(), vehicle::invalidate_mass(), m, m_bad, m_info, Character::mod_pain(), map::move_cost(), sounds::movement, Creature::moves, vehicle::name, OBJECT_NONE, one_in(), vehicle::part(), vehicle::part_count(), vehicle::pivot_point(), Character::pos(), vehicle_part::precalc, vehicle::precalc_mounts(), Character::setpos(), vehicle::shift_zlevel(), sounds::sound(), vehicle::total_mass(), tripoint_zero, vehicle::turn(), vehicle::turn_dir, u, vehicle::valid_wheel_config(), map::veh_at(), veh_pointer_or_null(), vehicle::wheelcache, tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by grabbed_move().

◆ handle_action()

bool game::handle_action ( )
private

Definition at line 1520 of file handle_action.cpp.

1521{
1522 std::string action;
1523 input_context ctxt;
1525 user_turn current_turn;
1526 // Check if we have an auto-move destination
1527 if( u.has_destination() ) {
1529 if( act == ACTION_NULL ) {
1530 add_msg( m_info, _( "Auto-move canceled" ) );
1532 return false;
1533 }
1534 } else if( u.has_destination_activity() ) {
1535 // starts destination activity after the player successfully reached his destination
1537 return false;
1538 } else {
1539 // No auto-move, ask player for input
1540 ctxt = get_player_input( action );
1541 }
1542
1543 const optional_vpart_position vp = m.veh_at( u.pos() );
1544 bool veh_ctrl = !u.is_dead_state() &&
1545 ( ( vp && vp->vehicle().player_in_control( u ) ) || remoteveh() != nullptr );
1546
1547 // If performing an action with right mouse button, co-ordinates
1548 // of location clicked.
1549 cata::optional<tripoint> mouse_target;
1550
1551 if( uquit == QUIT_WATCH && action == "QUIT" ) {
1552 uquit = QUIT_DIED;
1553 return false;
1554 }
1555
1556 if( act == ACTION_NULL ) {
1558
1559 if( act == ACTION_KEYBINDINGS ) {
1560 // already handled by input context
1561 return false;
1562 }
1563
1564 if( act == ACTION_MAIN_MENU ) {
1565 if( uquit == QUIT_WATCH ) {
1566 return false;
1567 }
1568 // No auto-move actions have or can be set at this point.
1570 destination_preview.clear();
1572 if( act == ACTION_NULL ) {
1573 return false;
1574 }
1575 }
1576
1577 if( act == ACTION_ACTIONMENU ) {
1578 if( uquit == QUIT_WATCH ) {
1579 return false;
1580 }
1581 // No auto-move actions have or can be set at this point.
1583 destination_preview.clear();
1585 if( act == ACTION_NULL ) {
1586 return false;
1587 }
1588#if defined(__ANDROID__)
1589 if( get_option<bool>( "ANDROID_ACTIONMENU_AUTOADD" ) && ctxt.get_category() == "DEFAULTMODE" ) {
1590 add_best_key_for_action_to_quick_shortcuts( act, ctxt.get_category(), false );
1591 }
1592#endif
1593 }
1594
1595 if( act == ACTION_KEYBINDINGS ) {
1597 destination_preview.clear();
1598 act = ctxt.display_menu( true );
1599 if( act == ACTION_NULL ) {
1600 return false;
1601 }
1602 }
1603
1606 }
1607
1608 if( act == ACTION_SELECT || act == ACTION_SEC_SELECT ) {
1609 // Mouse button click
1610 if( veh_ctrl ) {
1611 // No mouse use in vehicle
1612 return false;
1613 }
1614
1615 if( u.is_dead_state() ) {
1616 // do not allow mouse actions while dead
1617 return false;
1618 }
1619
1620 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
1621 if( !mouse_pos ) {
1622 return false;
1623 } else if( !u.sees( *mouse_pos ) ) {
1624 // Not clicked in visible terrain
1625 return false;
1626 }
1627 mouse_target = mouse_pos;
1628
1629 if( act == ACTION_SELECT ) {
1630 // Note: The following has the potential side effect of
1631 // setting auto-move destination state in addition to setting
1632 // act.
1633 if( !try_get_left_click_action( act, *mouse_target ) ) {
1634 return false;
1635 }
1636 } else if( act == ACTION_SEC_SELECT ) {
1637 if( !try_get_right_click_action( act, *mouse_target ) ) {
1638 return false;
1639 }
1640 }
1641 } else if( act != ACTION_TIMEOUT ) {
1642 // act has not been set for an auto-move, so clearing possible
1643 // auto-move destinations. Since initializing an auto-move with
1644 // the mouse may span across multiple actions, we do not clear the
1645 // auto-move destination if the action is only a timeout, as this
1646 // would require the user to double click quicker than the
1647 // timeout delay.
1649 destination_preview.clear();
1650 }
1651 }
1652
1653 if( act == ACTION_NULL ) {
1654 const input_event &&evt = ctxt.get_raw_input();
1655 if( !evt.sequence.empty() ) {
1656 const int ch = evt.get_first_input();
1657 const std::string &&name = inp_mngr.get_keyname( ch, evt.type, true );
1658 if( !get_option<bool>( "NO_UNKNOWN_COMMAND_MSG" ) ) {
1659 add_msg( m_info, _( "Unknown command: \"%s\" (%ld)" ), name, ch );
1660 if( const cata::optional<std::string> hint =
1662 add_msg( m_info, _( "%s at any time to see and edit keybindings relevant to "
1663 "the current context." ),
1664 *hint );
1665 }
1666 }
1667 }
1668 return false;
1669 }
1670
1671 // This has no action unless we're in a special game mode.
1672 gamemode->pre_action( act );
1673
1674 int soffset = get_option<int>( "MOVE_VIEW_OFFSET" );
1675
1676 int before_action_moves = u.moves;
1677
1678 // These actions are allowed while deathcam is active. Registered in game::get_player_input
1679 if( uquit == QUIT_WATCH || !u.is_dead_state() ) {
1680 switch( act ) {
1683 break;
1684
1685 case ACTION_CENTER:
1688 break;
1689
1690 case ACTION_SHIFT_N:
1691 case ACTION_SHIFT_NE:
1692 case ACTION_SHIFT_E:
1693 case ACTION_SHIFT_SE:
1694 case ACTION_SHIFT_S:
1695 case ACTION_SHIFT_SW:
1696 case ACTION_SHIFT_W:
1697 case ACTION_SHIFT_NW: {
1698 static const std::map<action_id, std::pair<point, point>> shift_delta = {
1707 };
1709 shift_delta.at( act ).second * soffset : shift_delta.at( act ).first * soffset;
1710 }
1711 break;
1712
1713 case ACTION_LOOK:
1714 look_around();
1715 break;
1716
1717 case ACTION_KEYBINDINGS:
1718 // already handled by input context
1719 break;
1720
1721 default:
1722 break;
1723 }
1724 }
1725
1726 // actions allowed only while alive
1727 if( !u.is_dead_state() ) {
1728 switch( act ) {
1729 case ACTION_NULL:
1730 case NUM_ACTIONS:
1731 break; // dummy entries
1732 case ACTION_ACTIONMENU:
1733 case ACTION_MAIN_MENU:
1734 case ACTION_KEYBINDINGS:
1735 break; // handled above
1736
1737 case ACTION_TIMEOUT:
1738 if( check_safe_mode_allowed( false ) ) {
1740 }
1741 break;
1742
1743 case ACTION_PAUSE:
1744 if( check_safe_mode_allowed() ) {
1746 }
1747 break;
1748
1749 case ACTION_CYCLE_MOVE:
1751 break;
1752
1753 case ACTION_RESET_MOVE:
1755 break;
1756
1757 case ACTION_TOGGLE_RUN:
1759 break;
1760
1763 break;
1764
1767 break;
1768
1769 case ACTION_MOVE_FORTH:
1771 case ACTION_MOVE_RIGHT:
1773 case ACTION_MOVE_BACK:
1775 case ACTION_MOVE_LEFT:
1777 if( !u.get_value( "remote_controlling" ).empty() &&
1781 } else if( veh_ctrl ) {
1782 // vehicle control uses x for steering and y for ac/deceleration,
1783 // so no rotation needed
1785 } else {
1787 if( auto_travel_mode && !u.is_auto_moving() ) {
1788 for( int i = 0; i < SEEX; i++ ) {
1789 tripoint auto_travel_destination( u.posx() + dest_delta.x * ( SEEX - i ),
1790 u.posy() + dest_delta.y * ( SEEX - i ),
1791 u.posz() );
1793 auto_travel_destination,
1795 u.get_path_avoid() );
1796 if( !destination_preview.empty() ) {
1799 break;
1800 }
1801 }
1804 if( dest_next == point_zero ) {
1806 }
1807 dest_delta = dest_next;
1808 }
1809 if( !avatar_action::move( u, m, dest_delta ) ) {
1810 // auto-move should be canceled due to a failed move or obstacle
1812 }
1813 }
1814 break;
1815 case ACTION_MOVE_DOWN:
1816 if( u.is_mounted() ) {
1817 auto mon = u.mounted_creature.get();
1818 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1819 add_msg( m_info, _( "You can't go down stairs while you're riding." ) );
1820 break;
1821 }
1822 }
1823 if( !u.in_vehicle ) {
1824 vertical_move( -1, false );
1825 } else if( veh_ctrl && vp->vehicle().is_rotorcraft() ) {
1827 }
1828 break;
1829
1830 case ACTION_MOVE_UP:
1831 if( u.is_mounted() ) {
1832 auto mon = u.mounted_creature.get();
1833 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1834 add_msg( m_info, _( "You can't go down stairs while you're riding." ) );
1835 break;
1836 }
1837 }
1838 if( !u.in_vehicle ) {
1839 vertical_move( 1, false );
1840 } else if( veh_ctrl && vp->vehicle().is_rotorcraft() ) {
1842 } else if( veh_ctrl && vp->vehicle().has_part( "ROTOR" ) &&
1843 !vp->vehicle().has_sufficient_rotorlift() ) {
1844 add_msg( m_bad, _( "The rotors struggle to generate enough lift!" ) );
1845 }
1846 break;
1847
1848 case ACTION_OPEN:
1850 add_msg( m_info, _( "You can't open things while you're in your shell." ) );
1851 } else if( u.is_mounted() ) {
1852 add_msg( m_info, _( "You can't open things while you're riding." ) );
1853 } else {
1854 open();
1855 }
1856 break;
1857
1858 case ACTION_CLOSE:
1860 add_msg( m_info, _( "You can't close things while you're in your shell." ) );
1861 } else if( u.is_mounted() ) {
1862 auto mon = u.mounted_creature.get();
1863 if( !mon->has_flag( MF_RIDEABLE_MECH ) ) {
1864 add_msg( m_info, _( "You can't close things while you're riding." ) );
1865 }
1866 } else if( mouse_target ) {
1867 doors::close_door( m, u, *mouse_target );
1868 } else {
1869 close();
1870 }
1871 break;
1872
1873 case ACTION_SMASH:
1874 if( veh_ctrl ) {
1875 handbrake();
1876 } else if( u.has_active_mutation( trait_SHELL2 ) ) {
1877 add_msg( m_info, _( "You can't smash things while you're in your shell." ) );
1878 } else {
1879 smash();
1880 }
1881 break;
1882
1883 case ACTION_EXAMINE:
1885 add_msg( m_info, _( "You can't examine your surroundings while you're in your shell." ) );
1886 } else if( mouse_target ) {
1887 examine( *mouse_target );
1888 } else {
1889 examine();
1890 }
1891 break;
1892
1893 case ACTION_ADVANCEDINV:
1895 add_msg( m_info, _( "You can't move mass quantities while you're in your shell." ) );
1896 } else if( u.is_mounted() ) {
1897 add_msg( m_info, _( "You can't move mass quantities while you're riding." ) );
1898 } else {
1900 }
1901 break;
1902
1903 case ACTION_PICKUP:
1905 add_msg( m_info, _( "You can't pick anything up while you're in your shell." ) );
1906 } else if( u.is_mounted() ) {
1907 add_msg( m_info, _( "You can't pick anything up while you're riding." ) );
1908 } else if( mouse_target ) {
1909 pickup( *mouse_target );
1910 } else {
1911 pickup();
1912 }
1913 break;
1914
1915 case ACTION_PICKUP_FEET:
1917 add_msg( m_info, _( "You can't pick anything up while you're in your shell." ) );
1918 } else {
1919 pickup_feet();
1920 }
1921 break;
1922
1923 case ACTION_GRAB:
1925 add_msg( m_info, _( "You can't grab things while you're in your shell." ) );
1926 } else if( u.is_mounted() ) {
1927 add_msg( m_info, _( "You can't grab things while you're riding." ) );
1928 } else {
1929 grab();
1930 }
1931 break;
1932
1933 case ACTION_HAUL:
1935 add_msg( m_info, _( "You can't haul things while you're in your shell." ) );
1936 } else if( u.is_mounted() ) {
1937 add_msg( m_info, _( "You can't haul things while you're riding." ) );
1938 } else {
1939 haul();
1940 }
1941 break;
1942
1943 case ACTION_BUTCHER:
1945 add_msg( m_info, _( "You can't butcher while you're in your shell." ) );
1946 } else if( u.is_mounted() ) {
1947 add_msg( m_info, _( "You can't butcher while you're riding." ) );
1948 } else {
1949 butcher();
1950 }
1951 break;
1952
1953 case ACTION_CHAT:
1954 chat();
1955 break;
1956
1957 case ACTION_PEEK:
1959 add_msg( m_info, _( "You can't peek around corners while you're in your shell." ) );
1960 } else if( u.is_mounted() ) {
1961 add_msg( m_info, _( "You can't peek around corners while you're riding." ) );
1962 } else {
1963 peek();
1964 }
1965 break;
1966
1967 case ACTION_LIST_ITEMS:
1969 break;
1970
1971 case ACTION_ZONES:
1972 zones_manager();
1973 break;
1974
1975 case ACTION_LOOT:
1976 loot();
1977 break;
1978
1979 case ACTION_INVENTORY:
1981 break;
1982
1983 case ACTION_COMPARE:
1985 break;
1986
1987 case ACTION_ORGANIZE:
1989 break;
1990
1991 case ACTION_USE:
1992 // Shell-users are presumed to be able to mess with their inventories, etc
1993 // while in the shell. Eating, gear-changing, and item use are OK.
1995 break;
1996
1997 case ACTION_USE_WIELDED:
1999 break;
2000
2001 case ACTION_WEAR:
2002 wear();
2003 break;
2004
2005 case ACTION_TAKE_OFF:
2006 takeoff();
2007 break;
2008
2009 case ACTION_EAT:
2010 if( !avatar_action::eat_here( u ) ) {
2012 }
2013 break;
2014
2016 if( !avatar_action::eat_here( u ) ) {
2018 }
2019 break;
2020
2021 case ACTION_READ:
2022 // Shell-users are presumed to have the book just at an opening and read it that way
2023 read();
2024 break;
2025
2026 case ACTION_WIELD:
2028 break;
2029
2030 case ACTION_PICK_STYLE:
2031 u.martial_arts_data->pick_style( u );
2032 break;
2033
2034 case ACTION_RELOAD_ITEM:
2036 break;
2037
2040 break;
2041
2044 break;
2045
2046 case ACTION_UNLOAD:
2048 break;
2049
2050 case ACTION_MEND:
2052 break;
2053
2054 case ACTION_THROW: {
2055 item_location loc;
2056 avatar_action::plthrow( g->u, loc );
2057 break;
2058 }
2059
2060 case ACTION_FIRE:
2061 fire();
2062 break;
2063
2064 case ACTION_CAST_SPELL:
2065 cast_spell();
2066 break;
2067
2068 case ACTION_FIRE_BURST: {
2069 if( u.weapon.gun_set_mode( gun_mode_id( "AUTO" ) ) ) {
2071 }
2072 break;
2073 }
2074
2076 if( u.is_armed() && u.weapon.is_gun() && !u.weapon.is_gunmod() ) {
2077 if( u.weapon.gun_all_modes().size() > 1 ) {
2079 } else {
2080 add_msg( m_info, _( "Your %s has only one firing mode." ), u.weapon.display_name() );
2081 }
2082 }
2083 break;
2084
2086 if( u.is_armed() && u.weapon.is_gun() && !u.weapon.is_gunmod() ) {
2088 }
2089 break;
2090
2091 case ACTION_DROP:
2092 // You CAN drop things to your own tile while in the shell.
2093 drop();
2094 break;
2095
2096 case ACTION_DIR_DROP:
2098 add_msg( m_info, _( "You can't drop things to another tile while you're in your shell." ) );
2099 } else {
2101 }
2102 break;
2103 case ACTION_BIONICS:
2104 show_bionics_ui( u );
2105 break;
2106 case ACTION_MUTATIONS:
2108 break;
2109
2110 case ACTION_SORT_ARMOR:
2112 break;
2113
2114 case ACTION_WAIT:
2115 wait();
2116 break;
2117
2118 case ACTION_CRAFT:
2120 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2121 } else if( u.is_mounted() ) {
2122 add_msg( m_info, _( "You can't craft while you're riding." ) );
2123 } else {
2124 u.craft();
2125 }
2126 break;
2127
2128 case ACTION_RECRAFT:
2130 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2131 } else if( u.is_mounted() ) {
2132 add_msg( m_info, _( "You can't craft while you're riding." ) );
2133 } else {
2134 u.recraft();
2135 }
2136 break;
2137
2138 case ACTION_LONGCRAFT:
2140 add_msg( m_info, _( "You can't craft while you're in your shell." ) );
2141 } else if( u.is_mounted() ) {
2142 add_msg( m_info, _( "You can't craft while you're riding." ) );
2143 } else {
2144 u.long_craft();
2145 }
2146 break;
2147
2148 case ACTION_DISASSEMBLE:
2149 if( u.controlling_vehicle ) {
2150 add_msg( m_info, _( "You can't disassemble items while driving." ) );
2151 } else if( u.is_mounted() ) {
2152 add_msg( m_info, _( "You can't disassemble items while you're riding." ) );
2153 } else {
2155 }
2156 break;
2157
2158 case ACTION_CONSTRUCT:
2159 if( u.in_vehicle ) {
2160 add_msg( m_info, _( "You can't construct while in a vehicle." ) );
2161 } else if( u.has_active_mutation( trait_SHELL2 ) ) {
2162 add_msg( m_info, _( "You can't construct while you're in your shell." ) );
2163 } else if( u.is_mounted() ) {
2164 add_msg( m_info, _( "You can't construct while you're riding." ) );
2165 } else {
2166 construction_menu( false );
2167 }
2168 break;
2169
2170 case ACTION_SLEEP:
2171 if( veh_ctrl ) {
2172 add_msg( m_info, _( "Vehicle control has moved, %s" ),
2173 press_x( ACTION_CONTROL_VEHICLE, _( "new binding is " ),
2174 _( "new default binding is '^'." ) ) );
2175 } else {
2176 sleep();
2177 }
2178 break;
2179
2182 add_msg( m_info, _( "You can't operate a vehicle while you're in your shell." ) );
2183 } else if( u.is_mounted() ) {
2184 u.dismount();
2185 } else {
2187 }
2188 break;
2189
2192 add_msg( m_info, auto_travel_mode ? _( "Auto travel mode ON!" ) : _( "Auto travel mode OFF!" ) );
2193 break;
2194
2196 if( safe_mode == SAFE_MODE_OFF ) {
2198 mostseen = 0;
2199 add_msg( m_info, _( "Safe mode ON!" ) );
2200 } else {
2203 add_msg( m_info, get_option<bool>( "AUTOSAFEMODE" )
2204 ? _( "Safe mode OFF! (Auto safe mode still enabled!)" ) : _( "Safe mode OFF!" ) );
2205 }
2209 }
2210 break;
2211
2213 auto &autosafemode_option = get_options().get_option( "AUTOSAFEMODE" );
2214 add_msg( m_info, autosafemode_option.value_as<bool>()
2215 ? _( "Auto safe mode OFF!" ) : _( "Auto safe mode ON!" ) );
2216 autosafemode_option.setNext();
2217 break;
2218 }
2219
2221 if( safe_mode == SAFE_MODE_STOP ) {
2222 add_msg( m_info, _( "Ignoring enemy!" ) );
2223 for( auto &elem : u.get_mon_visible().new_seen_mon ) {
2224 monster &critter = *elem;
2225 critter.ignoring = rl_dist( u.pos(), critter.pos() );
2226 }
2228 } else if( u.has_effect( effect_laserlocked ) ) {
2229 if( u.has_trait( trait_PROF_CHURL ) ) {
2230 add_msg( m_warning, _( "You make the sign of the cross." ) );
2231 } else {
2232 add_msg( m_info, _( "Ignoring laser targeting!" ) );
2233 }
2236 }
2237 break;
2238
2240 if( safe_mode == SAFE_MODE_STOP && !get_safemode().empty() ) {
2242 add_msg( m_info, _( "Creature whitelisted: %s" ), get_safemode().lastmon_whitelist );
2244 mostseen = 0;
2245 } else {
2246 get_safemode().show();
2247 }
2248 break;
2249
2250 case ACTION_SUICIDE:
2251 if( query_yn( _( "Commit suicide?" ) ) ) {
2252 if( query_yn( _( "REALLY commit suicide?" ) ) ) {
2253 u.apply_damage( &u, body_part_head, 99999 );
2254 u.moves = 0;
2255 u.place_corpse();
2257 }
2258 }
2259 break;
2260
2261 case ACTION_SAVE:
2262 if( query_yn( _( "Save and quit?" ) ) ) {
2263 if( save() ) {
2264 u.moves = 0;
2265 uquit = QUIT_SAVED;
2266 }
2267 }
2268 break;
2269
2270 case ACTION_QUICKSAVE:
2271 quicksave();
2272 return false;
2273
2274 case ACTION_QUICKLOAD:
2275 quickload();
2276 return false;
2277
2278 case ACTION_PL_INFO:
2280 break;
2281
2282 case ACTION_MAP:
2284 break;
2285
2286 case ACTION_SKY:
2287 if( m.is_outside( u.pos() ) ) {
2289 } else {
2290 add_msg( m_info, _( "You can't see the sky from here." ) );
2291 }
2292 break;
2293
2294 case ACTION_MISSIONS:
2295 list_missions();
2296 break;
2297
2298 case ACTION_SCORES:
2300 break;
2301
2302 case ACTION_DIARY:
2304 break;
2305
2306 case ACTION_FACTIONS:
2307 faction_manager_ptr->display();
2308 break;
2309
2310 case ACTION_MORALE:
2311 u.disp_morale();
2312 break;
2313
2314 case ACTION_MESSAGES:
2316 break;
2317
2318 case ACTION_HELP:
2320 break;
2321
2322 case ACTION_OPTIONS:
2323 get_options().show( true );
2324 break;
2325
2326 case ACTION_AUTOPICKUP:
2328 break;
2329
2330 case ACTION_AUTONOTES:
2332 break;
2333
2334 case ACTION_SAFEMODE:
2335 get_safemode().show();
2336 break;
2337
2340 break;
2341
2342 case ACTION_COLOR:
2343 all_colors.show_gui();
2344 break;
2345
2346 case ACTION_WORLD_MODS:
2347 world_generator->show_active_world_mods( world_generator->active_world->active_mod_order );
2348 break;
2349
2350 case ACTION_DEBUG:
2352 break; //don't do anything when sharing and not debugger
2353 }
2355 break;
2356
2359 break;
2360
2363 break;
2364
2367 break;
2368
2370 reload_tileset( []( std::string str ) {
2371 DebugLog( DL::Info, DC::Main ) << str;
2372 } );
2373 break;
2374
2376 get_options().get_option( "AUTO_FEATURES" ).setNext();
2377 get_options().save();
2378 //~ Auto Features are now ON/OFF
2379 add_msg( _( "%s are now %s." ),
2380 get_options().get_option( "AUTO_FEATURES" ).getMenuText(),
2381 get_option<bool>( "AUTO_FEATURES" ) ? _( "ON" ) : _( "OFF" ) );
2382 break;
2383
2385 get_options().get_option( "AUTO_PULP_BUTCHER" ).setNext();
2386 get_options().save();
2387 //~ Auto Pulp/Pulp Adjacent/Butcher is now set to x
2388 add_msg( _( "%s is now set to %s." ),
2389 get_options().get_option( "AUTO_PULP_BUTCHER" ).getMenuText(),
2390 get_options().get_option( "AUTO_PULP_BUTCHER" ).getValueName() );
2391 break;
2392
2394 get_options().get_option( "AUTO_MINING" ).setNext();
2395 get_options().save();
2396 //~ Auto Mining is now ON/OFF
2397 add_msg( _( "%s is now %s." ),
2398 get_options().get_option( "AUTO_MINING" ).getMenuText(),
2399 get_option<bool>( "AUTO_MINING" ) ? _( "ON" ) : _( "OFF" ) );
2400 break;
2401
2403 if( g->u.get_value( "THIEF_MODE" ) == "THIEF_ASK" ) {
2404 u.set_value( "THIEF_MODE", "THIEF_HONEST" );
2405 u.set_value( "THIEF_MODE_KEEP", "YES" );
2406 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2407 add_msg( _( "You will not pick up other peoples belongings." ) );
2408 } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_HONEST" ) {
2409 u.set_value( "THIEF_MODE", "THIEF_STEAL" );
2410 u.set_value( "THIEF_MODE_KEEP", "YES" );
2411 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2412 add_msg( _( "You will pick up also those things that belong to others!" ) );
2413 } else if( g->u.get_value( "THIEF_MODE" ) == "THIEF_STEAL" ) {
2414 u.set_value( "THIEF_MODE", "THIEF_ASK" );
2415 u.set_value( "THIEF_MODE_KEEP", "NO" );
2416 //~ Thief mode cycled between THIEF_ASK/THIEF_HONEST/THIEF_STEAL
2417 add_msg( _( "You will be reminded not to steal." ) );
2418 } else {
2419 // ERROR
2420 add_msg( _( "THIEF_MODE CONTAINED BAD VALUE [ %s ]!" ), g->u.get_value( "THIEF_MODE" ) );
2421 }
2422 break;
2423
2425 get_options().get_option( "AUTO_FORAGING" ).setNext();
2426 get_options().save();
2427 //~ Auto Foraging is now set to x
2428 add_msg( _( "%s is now set to %s." ),
2429 get_options().get_option( "AUTO_FORAGING" ).getMenuText(),
2430 get_options().get_option( "AUTO_FORAGING" ).getValueName() );
2431 break;
2432
2434 get_options().get_option( "AUTO_PICKUP" ).setNext();
2435 get_options().save();
2436 //~ Auto pickup is now set to x
2437 add_msg( _( "%s is now set to %s." ),
2438 get_options().get_option( "AUTO_PICKUP" ).getMenuText(),
2439 get_options().get_option( "AUTO_PICKUP" ).getValueName() );
2440 break;
2441
2444 break; //don't do anything when sharing and not debugger
2445 }
2446 display_scent();
2447 break;
2448
2451 break; //don't do anything when sharing and not debugger
2452 }
2453 display_scent();
2454 break;
2455
2458 break; //don't do anything when sharing and not debugger
2459 }
2461 break;
2464 break; //don't do anything when sharing and not debugger
2465 }
2467 break;
2470 break; //don't do anything when sharing and not debugger
2471 }
2473 break;
2474
2477 break; //don't do anything when sharing and not debugger
2478 }
2480 break;
2481
2484 break; //don't do anything when sharing and not debugger
2485 }
2487 break;
2488
2491 break; //don't do anything when sharing and not debugger
2492 }
2494 break;
2495
2497 g->debug_submap_grid_overlay = !g->debug_submap_grid_overlay;
2498 break;
2499
2502 break;
2503
2506 break; //don't do anything when sharing and not debugger
2507 }
2509 if( debug_mode ) {
2510 add_msg( m_info, _( "Debug mode ON!" ) );
2511 } else {
2512 add_msg( m_info, _( "Debug mode OFF!" ) );
2513 }
2514 break;
2515
2516 case ACTION_ZOOM_IN:
2517 zoom_in();
2519 break;
2520
2521 case ACTION_ZOOM_OUT:
2522 zoom_out();
2524 break;
2525
2526 case ACTION_ITEMACTION:
2528 break;
2529
2530 case ACTION_AUTOATTACK:
2532 break;
2533
2534 default:
2535 break;
2536 }
2537 }
2538 if( act != ACTION_TIMEOUT ) {
2539 u.mod_moves( -current_turn.moves_elapsed() );
2540 }
2541 gamemode->post_action( act );
2542
2543 u.movecounter = ( !u.is_dead_state() ? ( before_action_moves - u.moves ) : 0 );
2544 dbg( DL::Info ) << string_format( "%s: [%d] %d - %d = %d", action_ident( act ),
2545 to_turn<int>( calendar::turn ), before_action_moves, u.movecounter, u.moves );
2546 return ( !u.is_dead_state() );
2547}
cata::optional< std::string > press_x_if_bound(action_id act)
Definition: action.cpp:474
bool can_action_change_worldstate(const action_id act)
Lookup whether an action can affect the state of the game world.
Definition: action.cpp:352
action_id look_up_action(const std::string &ident)
Lookup an action ID by its unique string identifier.
Definition: action.cpp:423
action_id handle_main_menu()
Show in-game main menu.
Definition: action.cpp:947
point get_delta_from_movement_action(const action_id act, const iso_rotate rot)
Definition: action.cpp:512
action_id handle_action_menu()
Show the action menu.
Definition: action.cpp:660
@ ACTION_SAFEMODE
Open safemode manager.
Definition: action.h:267
@ ACTION_PEEK
Peek through something (e.g.
Definition: action.h:121
@ ACTION_OPEN
Open an item (e.g.
Definition: action.h:99
@ ACTION_CRAFT
Open crafting menu.
Definition: action.h:199
@ ACTION_DROP
Open the drop-item menu.
Definition: action.h:181
@ ACTION_READ
Open the read menu.
Definition: action.h:153
@ ACTION_TOGGLE_AUTO_PICKUP
Turn auto pickup on/off.
Definition: action.h:313
@ ACTION_MOVE_BACK_LEFT
Move towards bottom-left of screen / decelerate and steer left.
Definition: action.h:51
@ ACTION_ZOOM_IN
Zoom view out.
Definition: action.h:291
@ ACTION_EAT
Open the default consume item menu.
Definition: action.h:149
@ ACTION_SMASH
Smash something.
Definition: action.h:103
@ ACTION_ADVANCEDINV
Open the advanced inventory screen.
Definition: action.h:135
@ ACTION_QUICKSAVE
Quicksave the game.
Definition: action.h:227
@ ACTION_HELP
Display help screen.
Definition: action.h:253
@ ACTION_MESSAGES
Display messages screen.
Definition: action.h:251
@ ACTION_ZONES
Open the zone manager.
Definition: action.h:125
@ ACTION_TOGGLE_PIXEL_MINIMAP
Turn pixel minimap on/off.
Definition: action.h:297
@ ACTION_USE
Open the use menu.
Definition: action.h:141
@ ACTION_QUICKLOAD
Quickload the game.
Definition: action.h:229
@ ACTION_LIST_ITEMS
List items and monsters in a given square.
Definition: action.h:123
@ ACTION_DEBUG
Open debug menu.
Definition: action.h:281
@ ACTION_OPTIONS
Display options window.
Definition: action.h:261
@ ACTION_MOVE_FORTH
Move towards top of screen / accelerate.
Definition: action.h:41
@ ACTION_PICK_STYLE
Open the martial-arts style menu.
Definition: action.h:157
@ ACTION_CONSTRUCT
Open construct menu.
Definition: action.h:205
@ ACTION_MOVE_FORTH_RIGHT
Move towards top-right of screen / accelerate and steer right.
Definition: action.h:43
@ ACTION_SORT_ARMOR
Open the armor sorting menu.
Definition: action.h:189
@ ACTION_OPEN_CONSUME
Open the custom consume item menu.
Definition: action.h:151
@ ACTION_MORALE
Display morale effects screen.
Definition: action.h:249
@ ACTION_NULL
Invalid action used for various lookup errors.
Definition: action.h:24
@ ACTION_RESET_MOVE
Reset movement mode to walk
Definition: action.h:63
@ ACTION_CHAT
Chat with something.
Definition: action.h:117
@ ACTION_RELOAD_WIELDED
Attempt to reload wielded object.
Definition: action.h:163
@ ACTION_MOVE_DOWN
Descend a staircase.
Definition: action.h:57
@ ACTION_MISSIONS
Display missions screen.
Definition: action.h:243
@ ACTION_AUTONOTES
Open autonotes manager.
Definition: action.h:265
@ ACTION_WIELD
Open the wield menu.
Definition: action.h:155
@ ACTION_THROW
Open the throw menu.
Definition: action.h:169
@ ACTION_TOGGLE_AUTO_MINING
Turn auto mining on/off.
Definition: action.h:309
@ ACTION_INVENTORY
Open the primary inventory screen.
Definition: action.h:133
@ ACTION_TOGGLE_AUTOSAFE
Turn automatic triggering of safemode on/off.
Definition: action.h:217
@ ACTION_OPEN_MOVEMENT
Open movement mode menu.
Definition: action.h:69
@ ACTION_COMPARE
Open the item compare screen.
Definition: action.h:137
@ ACTION_SCORES
Display scores screen.
Definition: action.h:245
@ ACTION_BUTCHER
Butcher or disassemble objects in current square.
Definition: action.h:115
@ ACTION_SEC_SELECT
Click on a point with secondary mouse button (usually right button)
Definition: action.h:31
@ ACTION_TOGGLE_CROUCH
Toggle crouch on/off.
Definition: action.h:67
@ ACTION_TOGGLE_HOUR_TIMER
Toggle timing of the game hours.
Definition: action.h:329
@ ACTION_SELECT
Click on a point with primary mouse button (usually left button)
Definition: action.h:29
@ ACTION_MAIN_MENU
Display main menu.
Definition: action.h:255
@ ACTION_DISPLAY_SUBMAP_GRID
Toggle submap grid overlay.
Definition: action.h:327
@ ACTION_WAIT
Open wait menu.
Definition: action.h:197
@ ACTION_ACTIONMENU
Open the action menu.
Definition: action.h:293
@ ACTION_DISASSEMBLE
Open disassemble menu.
Definition: action.h:207
@ ACTION_LOOT
Sort out the loot.
Definition: action.h:127
@ ACTION_TOGGLE_FULLSCREEN
Toggle full-screen mode.
Definition: action.h:279
@ ACTION_MAP
Display over-map.
Definition: action.h:239
@ ACTION_MEND
Open the mending menu (e.g.
Definition: action.h:167
@ ACTION_TOGGLE_THIEF_MODE
Toggle permanent attitude to stealing.
Definition: action.h:219
@ ACTION_USE_WIELDED
Use currently wielded item.
Definition: action.h:143
@ ACTION_PL_INFO
Display player status screen.
Definition: action.h:237
@ ACTION_DISPLAY_SCENT_TYPE
Toggle scent type map.
Definition: action.h:285
@ ACTION_TOGGLE_AUTO_FORAGING
Turn auto foraging on/off.
Definition: action.h:311
@ ACTION_FIRE_BURST
Burst-fire the current weapon.
Definition: action.h:173
@ ACTION_BIONICS
Open the bionics menu.
Definition: action.h:185
@ ACTION_CONTROL_VEHICLE
Open vehicle control menu.
Definition: action.h:211
@ ACTION_SAVE
Save the game and quit.
Definition: action.h:225
@ ACTION_MOVE_UP
Ascend a staircase.
Definition: action.h:59
@ ACTION_TOGGLE_PANEL_ADM
Turn admin panel on/off.
Definition: action.h:299
@ ACTION_TOGGLE_AUTO_PULP_BUTCHER
Change auto pulp/butcher mode.
Definition: action.h:307
@ ACTION_TOGGLE_AUTO_TRAVEL_MODE
Turn auto travel mode on/off.
Definition: action.h:213
@ ACTION_COLOR
Open color manager.
Definition: action.h:269
@ ACTION_TIMEOUT
Input timeout.
Definition: action.h:39
@ ACTION_TOGGLE_RUN
Toggle run on/off.
Definition: action.h:65
@ ACTION_FACTIONS
Display factions screen.
Definition: action.h:247
@ ACTION_GRAB
Grab or let go of an object.
Definition: action.h:111
@ ACTION_MOVE_BACK
Move towards bottom of screen / decelerate.
Definition: action.h:49
@ ACTION_CAST_SPELL
Cast a spell (only if any spells are known)
Definition: action.h:179
@ ACTION_DIR_DROP
Drop items in a given direction.
Definition: action.h:183
@ ACTION_AUTOATTACK
Auto select and attack hostile creature within range.
Definition: action.h:191
@ ACTION_CYCLE_MOVE
Cycle run/walk/crouch mode.
Definition: action.h:61
@ ACTION_SKY
Show sky state for trying to predict weather.
Definition: action.h:241
@ ACTION_FIRE
Fire the wielded weapon, or open fire menu if none.
Definition: action.h:171
@ ACTION_PAUSE
Pause an on-going activity.
Definition: action.h:37
@ ACTION_MOVE_BACK_RIGHT
Move towards bottom-right of screen / decelerate and steer right.
Definition: action.h:47
@ ACTION_MUTATIONS
Open the mutations menu.
Definition: action.h:187
@ ACTION_HAUL
Haul pile of items, or let go of them.
Definition: action.h:113
@ ACTION_MOVE_RIGHT
Move / steer right.
Definition: action.h:45
@ ACTION_SLEEP
Open sleep menu.
Definition: action.h:209
@ ACTION_ITEMACTION
Open the item uses menu.
Definition: action.h:295
@ ACTION_MOVE_LEFT
Move / steer left.
Definition: action.h:53
@ ACTION_SELECT_DEFAULT_AMMO
Change default ammo for current weapon.
Definition: action.h:177
@ ACTION_AUTOPICKUP
Open autopickup manager.
Definition: action.h:263
@ ACTION_SUICIDE
Commit suicide.
Definition: action.h:231
@ NUM_ACTIONS
Not an action, serves as count of enumerated actions.
Definition: action.h:331
@ ACTION_ZOOM_OUT
Zoom view in.
Definition: action.h:289
@ ACTION_SELECT_FIRE_MODE
Change fire mode of the current weapon.
Definition: action.h:175
@ ACTION_UNLOAD
Open the unload item (e.g.
Definition: action.h:165
@ ACTION_RECRAFT
Repeat last craft command.
Definition: action.h:201
@ ACTION_TAKE_OFF
Open the take-off clothing selection menu.
Definition: action.h:147
@ ACTION_PICKUP_FEET
Pick up items from current square.
Definition: action.h:109
@ ACTION_TOGGLE_AUTO_FEATURES
Turn auto features on/off.
Definition: action.h:305
@ ACTION_WORLD_MODS
Open active world mods.
Definition: action.h:271
@ ACTION_TOGGLE_DEBUG_MODE
Toggle debug mode.
Definition: action.h:287
@ ACTION_ORGANIZE
Swap inventory letters.
Definition: action.h:139
@ ACTION_MOVE_FORTH_LEFT
Move towards top-left of screen / accelerate and steer left.
Definition: action.h:55
@ ACTION_RELOAD_TILESET
Reload current tileset.
Definition: action.h:303
@ ACTION_CLOSE
Close an item (e.g.
Definition: action.h:101
@ ACTION_RELOAD_WEAPON
Attempt to reload wielded weapon, then fall back to the load item select menu.
Definition: action.h:161
@ ACTION_RELOAD_ITEM
Open the load item (e.g.
Definition: action.h:159
@ ACTION_PICKUP
Pick up items from current/adjacent squares.
Definition: action.h:107
@ ACTION_LONGCRAFT
Open batch crafting menu.
Definition: action.h:203
@ ACTION_DISTRACTION_MANAGER
Open distraction manager.
Definition: action.h:273
@ ACTION_WEAR
Open the wear clothing selection menu.
Definition: action.h:145
@ ACTION_DIARY
Display diary window.
Definition: action.h:257
void create_advanced_inv()
void show_armor_layers_ui(Character &who)
auto_notes::auto_note_settings & get_auto_notes_settings()
Definition: auto_note.cpp:386
auto_pickup::player_settings & get_auto_pickup()
Definition: auto_pickup.cpp:38
void show_bionics_ui(Character &who)
Definition: bionics_ui.cpp:533
const bodypart_str_id body_part_head("head")
bool tile_iso
Using isometric tileset.
bool debug_mode
Extended debugging mode, can be toggled during game.
bool has_active_mutation(const trait_id &b) const
Definition: mutation.cpp:367
pimpl< character_martial_arts > martial_arts_data
Definition: character.h:1550
bool has_active_item(const itype_id &id) const
Whether the player carries an active item of the given item type.
Definition: character.cpp:2479
void place_corpse()
std::set< tripoint > get_path_avoid() const override
Returns a set of points we do not want to path through.
Definition: character.cpp:9907
bool has_destination_activity() const
bool is_auto_moving() const
void start_destination_activity()
action_id get_next_auto_move_direction()
const pathfinding_settings & get_pathfinding_settings() const override
Returns settings for pathfinding.
Definition: character.cpp:9921
bool is_armed() const
Returns true if the character is wielding something.
Definition: melee.cpp:148
void dismount()
Definition: character.cpp:1168
item weapon
Definition: character.h:1546
void set_value(const std::string &key, const std::string &value)
Definition: creature.cpp:1337
std::string get_value(const std::string &key) const
Definition: creature.cpp:1347
void mod_moves(int nmoves)
Definition: creature.cpp:1414
void cycle_move_mode()
Definition: avatar.cpp:1187
void toggle_map_memory()
Definition: avatar.cpp:122
void toggle_crouch_mode()
Definition: avatar.cpp:1171
void toggle_run_mode()
Definition: avatar.cpp:1162
void disp_morale()
Provides the window and detailed morale data.
Definition: avatar.cpp:1001
void reset_move_mode()
Definition: avatar.cpp:1180
static void show_diary_ui(diary *c_diary)
Definition: diary_ui.cpp:164
void item_action_menu()
void display_radiation()
Definition: game.cpp:11210
void list_missions()
Definition: mission_ui.cpp:22
input_context get_player_input(std::string &action)
bool try_get_left_click_action(action_id &act, const tripoint &mouse_target)
Definition: game.cpp:2292
void set_safe_mode(safe_mode_type mode)
Definition: game.cpp:8589
void reload_tileset(std::function< void(std::string)> out)
Definition: game.cpp:427
void pickup_feet()
Definition: game.cpp:5590
void zones_manager()
Definition: game.cpp:6063
int turnssincelastmon
Definition: game.h:1021
void display_visibility()
Definition: game.cpp:11124
void display_scent()
Definition: game.cpp:11089
bool save()
Returns false if saving failed.
Definition: game.cpp:2722
void butcher()
Definition: game.cpp:8271
void display_temperature()
Definition: game.cpp:11110
bool auto_travel_mode
Definition: game.h:1018
void zoom_out()
Definition: game.cpp:7013
void toggle_pixel_minimap()
Definition: game.cpp:416
void toggle_debug_hour_timer()
Definition: game.cpp:11156
void display_transparency()
Definition: game.cpp:11217
void list_items_monsters()
Definition: game.cpp:7191
cata::optional< tripoint > look_around(bool force_3d=false)
Definition: game.cpp:6538
void chat()
Definition: npctalk.cpp:395
void quickload()
Definition: game.cpp:11252
void pickup()
Definition: game.cpp:5568
void vertical_move(int z, bool force, bool peeking=false)
Moves the player vertically.
Definition: game.cpp:9938
void open_consume_item_menu()
void display_lighting()
Definition: game.cpp:11184
void control_vehicle()
Definition: game.cpp:5137
void peek()
Definition: game.cpp:5597
void drop()
Definition: game.cpp:8009
bool try_get_right_click_action(action_id &act, const tripoint &mouse_target)
Definition: game.cpp:2320
bool check_safe_mode_allowed(bool repeat_safe_mode_warnings=true)
Check whether movement is allowed according to safe mode settings.
Definition: game.cpp:8527
void zoom_in()
Definition: game.cpp:7025
void toggle_fullscreen()
Definition: game.cpp:406
void display_vehicle_ai()
Definition: game.cpp:11117
void mark_main_ui_adaptor_resize() const
Definition: game.cpp:2970
void drop_in_direction()
Definition: game.cpp:8014
void display_help()
Definition: help.cpp:140
cata::optional< tripoint > get_coordinates(const catacurses::window &capture_win_)
Get the coordinates associated with the last mouse click (if any).
Definition: input.cpp:1338
input_event get_raw_input()
Temporary method to retrieve the raw input received, so that input_contexts can be used in screens wh...
Definition: input.cpp:1299
action_id display_menu(bool permit_execute_action=false)
Displays the possible actions in the current context and their keybindings.
Definition: input.cpp:999
std::string get_keyname(int ch, input_event_t inp_type, bool portable=false) const
Get the key name associated with the given keyboard keycode.
Definition: input.cpp:415
bool is_gun() const
Can this item be used to perform a ranged attack?
Definition: item.cpp:6522
void gun_cycle_mode()
Switch to the next available firing mode.
Definition: item.cpp:7920
std::string display_name(unsigned int quantity=1) const
Returns the item name and the charges or contained charges (if the item can have charges at all).
Definition: item.cpp:4809
bool is_gunmod() const
Definition: item.cpp:6552
std::map< gun_mode_id, gun_mode > gun_all_modes() const
Get all possible modes for this gun inclusive of any attached gunmods.
Definition: item.cpp:7839
bool gun_set_mode(const gun_mode_id &mode)
Try to set the mode for a gun, returning false if no such mode is possible.
Definition: item.cpp:7911
bool is_outside(const tripoint &p) const
Definition: map.cpp:2632
std::vector< tripoint > route(const tripoint &f, const tripoint &t, const pathfinding_settings &settings, const std::set< tripoint > &pre_closed={{ }}) const
Calculate the best path using A*.
const tripoint & pos() const override
Definition: monster.cpp:256
short ignoring
Definition: monster.h:504
cOpt & get_option(const std::string &name)
Definition: options.cpp:3383
std::string show(bool ingame=false, bool world_options_only=false, const std::function< bool()> &on_quit=nullptr)
Definition: options.cpp:2760
void show_adm()
Definition: panels.cpp:2287
void craft(const tripoint &loc=tripoint_zero)
Start various types of crafts.
Definition: crafting.cpp:341
int movecounter
Definition: player.h:247
void recraft(const tripoint &loc=tripoint_zero)
Definition: crafting.cpp:352
void long_craft(const tripoint &loc=tripoint_zero)
Definition: crafting.cpp:361
void add_rule(const std::string &rule_in, Creature::Attitude attitude_in, int proximity_in, rule_state state_in)
void show()
Definition: safemode_ui.cpp:39
int moves_elapsed()
#define all_colors
Definition: color.h:15
cata::optional< construction_id > construction_menu(const bool blueprint)
@ Info
Information (default: enabled).
@ Main
Generic messages related to game startup and operation.
#define DebugLog(lev, cl)
DebugLog.
Definition: debug.h:274
@ RULE_WHITELISTED
Definition: enums.h:53
@ SAFE_MODE_OFF
Definition: game.h:77
@ QUIT_SAVED
Definition: game.h:70
static void open_movement_mode_menu()
static void smash()
static void open()
#define dbg(x)
static void takeoff()
static void read()
static void wait()
static const efftype_id effect_laserlocked("laserlocked")
static void rcdrive(const point &d)
static void wear()
static void close()
static const bionic_id bio_remote("bio_remote")
static void pldrive(const tripoint &p)
static void haul()
static const trait_id trait_SHELL2("SHELL2")
static const trait_id trait_PROF_CHURL("PROF_CHURL")
static void cast_spell()
static void loot()
static void fire()
static void grab()
static const itype_id itype_radiocontrol("radiocontrol")
help & get_help()
Definition: help.cpp:30
void show_mutations_ui(Character &who)
bool isDebugger()
Definition: mapsharing.cpp:65
bool isCompetitive()
Definition: mapsharing.cpp:35
void reload_wielded(bool prompt=false)
Reload wielded item.
void reload_item()
Prompt to reload some item.
void use_item(avatar &you, item_location &loc)
bool eat_here(avatar &you)
void wield()
Prompt to wield some item.
void autoattack(avatar &you, map &m)
void eat(avatar &you)
Eat food or fuel 'E' (or 'a')
void fire_wielded_weapon(avatar &you)
Checks if the wielded weapon is a gun and can be fired then starts interactive aiming.
void plthrow(avatar &you, item_location loc, const cata::optional< tripoint > &blind_throw_from_pos=cata::nullopt)
void reload_weapon(bool try_everything=true)
Reload a wielded gun/tool.
void mend(avatar &you, item_location loc)
void unload(avatar &you)
Prompts to unload some item.
void use_item(avatar &you, item_location loc)
Use a tool at given location.
void disp_info(Character &ch)
Handles and displays detailed character info for the '@' screen.
void do_pause(Character &who)
Do pause action ('.
void debug()
void close_door(map &m, Character &who, const tripoint &closep)
Handles deducting moves, printing messages (only non-NPCs cause messages), actually closing it,...
Definition: gates.cpp:256
void compare(player &p, const cata::optional< tripoint > &offset)
void common(avatar &you)
void swap_letters(player &p)
void prompt_select_default_ammo_for(avatar &u, const item &w)
Prompts to select default ammo compatible with provided gun.
Definition: ranged.cpp:3760
void display_visible_weather()
Display overmap like with display() and display the weather that is within line of sight.
void display()
Display overmap centered at the player's position.
options_manager & get_options()
Definition: options.cpp:142
T get_option(const std::string &name)
Definition: options.h:368
static constexpr point point_south_west
Definition: point.h:267
static constexpr point point_north_east
Definition: point.h:263
static constexpr point point_north_west
Definition: point.h:269
@ sleep
Will recharge only when character is asleep.
An instance of an input, like a keypress etc.
Definition: input.h:95
std::vector< int > sequence
Definition: input.h:101
int get_first_input() const
Definition: input.cpp:100
input_event_t type
Definition: input.h:96
void handbrake()

References _, Creature::A_ANY, achievements_tracker_ptr, act, action, ACTION_ACTIONMENU, ACTION_ADVANCEDINV, ACTION_AUTOATTACK, ACTION_AUTONOTES, ACTION_AUTOPICKUP, ACTION_BIONICS, ACTION_BUTCHER, ACTION_CAST_SPELL, ACTION_CENTER, ACTION_CHAT, ACTION_CLOSE, ACTION_COLOR, ACTION_COMPARE, ACTION_CONSTRUCT, ACTION_CONTROL_VEHICLE, ACTION_CRAFT, ACTION_CYCLE_MOVE, ACTION_DEBUG, ACTION_DIARY, ACTION_DIR_DROP, ACTION_DISASSEMBLE, ACTION_DISPLAY_LIGHTING, ACTION_DISPLAY_RADIATION, ACTION_DISPLAY_SCENT, ACTION_DISPLAY_SCENT_TYPE, ACTION_DISPLAY_SUBMAP_GRID, ACTION_DISPLAY_TEMPERATURE, ACTION_DISPLAY_TRANSPARENCY, ACTION_DISPLAY_VEHICLE_AI, ACTION_DISPLAY_VISIBILITY, ACTION_DISTRACTION_MANAGER, ACTION_DROP, ACTION_EAT, ACTION_EXAMINE, ACTION_FACTIONS, ACTION_FIRE, ACTION_FIRE_BURST, ACTION_GRAB, ACTION_HAUL, ACTION_HELP, action_ident(), ACTION_IGNORE_ENEMY, ACTION_INVENTORY, ACTION_ITEMACTION, ACTION_KEYBINDINGS, ACTION_LIST_ITEMS, ACTION_LONGCRAFT, ACTION_LOOK, ACTION_LOOT, ACTION_MAIN_MENU, ACTION_MAP, ACTION_MEND, ACTION_MESSAGES, ACTION_MISSIONS, ACTION_MORALE, ACTION_MOVE_BACK, ACTION_MOVE_BACK_LEFT, ACTION_MOVE_BACK_RIGHT, ACTION_MOVE_DOWN, ACTION_MOVE_FORTH, ACTION_MOVE_FORTH_LEFT, ACTION_MOVE_FORTH_RIGHT, ACTION_MOVE_LEFT, ACTION_MOVE_RIGHT, ACTION_MOVE_UP, ACTION_MUTATIONS, ACTION_NULL, ACTION_OPEN, ACTION_OPEN_CONSUME, ACTION_OPEN_MOVEMENT, ACTION_OPTIONS, ACTION_ORGANIZE, ACTION_PAUSE, ACTION_PEEK, ACTION_PICK_STYLE, ACTION_PICKUP, ACTION_PICKUP_FEET, ACTION_PL_INFO, ACTION_QUICKLOAD, ACTION_QUICKSAVE, ACTION_READ, ACTION_RECRAFT, ACTION_RELOAD_ITEM, ACTION_RELOAD_TILESET, ACTION_RELOAD_WEAPON, ACTION_RELOAD_WIELDED, ACTION_RESET_MOVE, ACTION_SAFEMODE, ACTION_SAVE, ACTION_SCORES, ACTION_SEC_SELECT, ACTION_SELECT, ACTION_SELECT_DEFAULT_AMMO, ACTION_SELECT_FIRE_MODE, ACTION_SHIFT_E, ACTION_SHIFT_N, ACTION_SHIFT_NE, ACTION_SHIFT_NW, ACTION_SHIFT_S, ACTION_SHIFT_SE, ACTION_SHIFT_SW, ACTION_SHIFT_W, ACTION_SKY, ACTION_SLEEP, ACTION_SMASH, ACTION_SORT_ARMOR, ACTION_SUICIDE, ACTION_TAKE_OFF, ACTION_THROW, ACTION_TIMEOUT, ACTION_TOGGLE_AUTO_FEATURES, ACTION_TOGGLE_AUTO_FORAGING, ACTION_TOGGLE_AUTO_MINING, ACTION_TOGGLE_AUTO_PICKUP, ACTION_TOGGLE_AUTO_PULP_BUTCHER, ACTION_TOGGLE_AUTO_TRAVEL_MODE, ACTION_TOGGLE_AUTOSAFE, ACTION_TOGGLE_CROUCH, ACTION_TOGGLE_DEBUG_MODE, ACTION_TOGGLE_FULLSCREEN, ACTION_TOGGLE_HOUR_TIMER, ACTION_TOGGLE_MAP_MEMORY, ACTION_TOGGLE_PANEL_ADM, ACTION_TOGGLE_PIXEL_MINIMAP, ACTION_TOGGLE_RUN, ACTION_TOGGLE_SAFEMODE, ACTION_TOGGLE_THIEF_MODE, ACTION_UNLOAD, ACTION_USE, ACTION_USE_WIELDED, ACTION_WAIT, ACTION_WEAR, ACTION_WHITELIST_ENEMY, ACTION_WIELD, ACTION_WORLD_MODS, ACTION_ZONES, ACTION_ZOOM_IN, ACTION_ZOOM_OUT, add_msg(), safemode::add_rule(), all_colors, Character::apply_damage(), auto_travel_mode, avatar_action::autoattack(), bio_remote, body_part_head, butcher(), can_action_change_worldstate(), cast_spell(), chat(), check_safe_mode_allowed(), Character::clear_destination(), close(), doors::close_door(), game_menus::inv::common(), game_menus::inv::compare(), construction_menu(), control_vehicle(), Character::controlling_vehicle, player::craft(), create_advanced_inv(), avatar::cycle_move_mode(), dbg, debug_menu::debug(), debug_mode, DebugLog, destination_preview, crafting::disassemble(), Character::dismount(), character_display::disp_info(), avatar::disp_morale(), ui::omap::display(), help::display_help(), display_lighting(), input_context::display_menu(), Messages::display_messages(), item::display_name(), display_radiation(), display_scent(), display_temperature(), display_transparency(), display_vehicle_ai(), display_visibility(), ui::omap::display_visible_weather(), character_funcs::do_pause(), driving_view_offset, drop(), drop_in_direction(), avatar_action::eat(), avatar_action::eat_here(), effect_laserlocked, examine(), faction_manager_ptr, fire(), avatar_action::fire_wielded_weapon(), g, gamemode, get_auto_notes_settings(), get_auto_pickup(), avatar::get_avatar_diary(), input_context::get_coordinates(), get_delta_from_movement_action(), get_distraction_manager(), input_event::get_first_input(), get_help(), input_manager::get_keyname(), get_kill_tracker(), panel_manager::get_manager(), avatar::get_mon_visible(), Character::get_next_auto_move_direction(), options_manager::get_option(), get_option(), get_options(), Character::get_path_avoid(), Character::get_pathfinding_settings(), get_player_input(), input_context::get_raw_input(), get_safemode(), Creature::get_value(), grab(), item::gun_all_modes(), item::gun_cycle_mode(), item::gun_set_mode(), handbrake(), handle_action_menu(), handle_main_menu(), Character::has_active_bionic(), Character::has_active_item(), Character::has_active_mutation(), Character::has_destination(), Character::has_destination_activity(), Creature::has_effect(), Character::has_trait(), haul(), monster::ignoring, Character::in_vehicle, Info, inp_mngr, Character::is_armed(), Character::is_auto_moving(), Character::is_dead_state(), item::is_gun(), item::is_gunmod(), Character::is_mounted(), map::is_outside(), MAP_SHARING::isCompetitive(), MAP_SHARING::isDebugger(), item_action_menu(), itype_radiocontrol, list_items_monsters(), list_missions(), player::long_craft(), look_around(), look_up_action(), loot(), m, m_bad, m_info, m_warning, Main, mark_main_ui_adaptor_resize(), Character::martial_arts_data, avatar_action::mend(), MF_RIDEABLE_MECH, Creature::mod_moves(), mostseen, Character::mounted_creature, avatar_action::move(), player::movecounter, Creature::moves, user_turn::moves_elapsed(), om_direction::name(), monster_visible_info::new_seen_mon, no, cata::nullopt, NUM_ACTIONS, open(), open_consume_item_menu(), open_movement_mode_menu(), peek(), pickup(), pickup_feet(), Character::place_corpse(), pldrive(), avatar_action::plthrow(), point_east, point_north, point_north_east, point_north_west, point_south, point_south_east, point_south_west, point_west, point_zero, Character::pos(), monster::pos(), Character::posx(), Character::posy(), Character::posz(), press_x(), press_x_if_bound(), ranged::prompt_select_default_ammo_for(), query_yn(), quickload(), quicksave(), QUIT_DIED, QUIT_SAVED, QUIT_SUICIDE, QUIT_WATCH, rcdrive(), read(), player::recraft(), avatar_action::reload_item(), reload_tileset(), avatar_action::reload_weapon(), avatar_action::reload_wielded(), remoteveh(), Creature::remove_effect(), avatar::reset_move_mode(), rl_dist(), map::route(), RULE_WHITELISTED, safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAFE_MODE_STOP, safe_mode_warning_logged, save(), options_manager::save(), Character::sees(), SEEX, input_event::sequence, Character::set_destination(), set_safe_mode(), Creature::set_value(), options_manager::cOpt::setNext(), auto_pickup::player_settings::show(), distraction_manager::distraction_manager_gui::show(), safemode::show(), options_manager::show(), panel_manager::show_adm(), show_armor_layers_ui(), show_bionics_ui(), diary::show_diary_ui(), auto_notes::auto_note_settings::show_gui(), show_mutations_ui(), show_scores_ui(), sleep, smash(), Character::start_destination_activity(), stats(), string_format(), game_menus::inv::swap_letters(), takeoff(), tile_iso, avatar::toggle_crouch_mode(), toggle_debug_hour_timer(), toggle_fullscreen(), avatar::toggle_map_memory(), toggle_pixel_minimap(), avatar::toggle_run_mode(), trait_PROF_CHURL, trait_SHELL2, tripoint_above, tripoint_below, try_get_left_click_action(), try_get_right_click_action(), calendar::turn, turnssincelastmon, input_event::type, u, avatar_action::unload(), uquit, avatar_action::use_item(), avatar_funcs::use_item(), use_tiles, user_action_counter, map::veh_at(), vertical_move(), player::view_offset, w_terrain, wait(), Character::weapon, wear(), avatar_action::wield(), world_generator, point::x, tripoint::x, point::y, tripoint::y, yes, zones_manager(), zoom_in(), and zoom_out().

Referenced by do_turn().

◆ handle_key_blocking_activity()

void game::handle_key_blocking_activity ( )
private

Definition at line 1971 of file game.cpp.

1972{
1974 const std::string action = ctxt.handle_input( 0 );
1975 bool refresh = true;
1976 if( action == "pause" ) {
1978 cancel_activity_query( _( "Confirm:" ) );
1979 }
1980 } else if( action == "player_data" ) {
1982 } else if( action == "messages" ) {
1984 } else if( action == "help" ) {
1986 } else if( action != "HELP_KEYBINDINGS" ) {
1987 refresh = false;
1988 }
1989 if( refresh ) {
1992 }
1993}
bool cancel_activity_query(const std::string &text)
Asks if the player wants to cancel their activity, and if so cancels it.
Definition: game.cpp:1755
const std::string & handle_input()
Handles input and returns the next action in the queue.
Definition: input.cpp:854
bool interruptable_with_kb
Controls whether this activity can be cancelled with 'pause' action.
void refresh()

References _, action, Character::activity, cancel_activity_query(), character_display::disp_info(), help::display_help(), Messages::display_messages(), get_default_mode_input_context(), get_help(), input_context::handle_input(), player_activity::interruptable_with_kb, ui_manager::redraw(), catacurses::refresh(), refresh_display(), and u.

Referenced by process_voluntary_act_interrupt().

◆ handle_mouseview()

bool game::handle_mouseview ( input_context ctxt,
std::string &  action 
)
private

Definition at line 1997 of file game.cpp.

1998{
1999 cata::optional<tripoint> liveview_pos;
2000
2001 do {
2002 action = ctxt.handle_input();
2003 if( action == "MOUSE_MOVE" ) {
2004 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
2005 if( mouse_pos && ( !liveview_pos || *mouse_pos != *liveview_pos ) ) {
2006 liveview_pos = mouse_pos;
2007 liveview.show( *liveview_pos );
2008 } else if( !mouse_pos ) {
2009 liveview_pos.reset();
2010 liveview.hide();
2011 }
2013 }
2014 } while( action == "MOUSE_MOVE" ); // Freeze animation when moving the mouse
2015
2016 if( action != "TIMEOUT" ) {
2017 // Keyboard event, break out of animation loop
2018 liveview.hide();
2019 return false;
2020 }
2021
2022 // Mouse movement or un-handled key
2023 return true;
2024}
void reset() noexcept
Definition: optional.h:158
void hide()
Definition: live_view.cpp:33
void show(const tripoint &p)
Definition: live_view.cpp:38

References action, input_context::get_coordinates(), input_context::handle_input(), live_view::hide(), liveview, ui_manager::redraw(), cata::optional< T >::reset(), live_view::show(), and w_terrain.

Referenced by get_player_input().

◆ has_gametype()

bool game::has_gametype ( ) const

Definition at line 530 of file game.cpp.

531{
532 return gamemode && gamemode->id() != SGAME_NULL;
533}

References gamemode, and SGAME_NULL.

◆ init_autosave()

void game::init_autosave ( )
private

Definition at line 11224 of file game.cpp.

11225{
11227 last_save_timestamp = time( nullptr );
11228}

References last_save_timestamp, moves_since_last_save, and time.

Referenced by load(), and start_game().

◆ inv_map_splice()

item_location game::inv_map_splice ( item_filter  filter,
const std::string &  title,
int  radius = 0,
const std::string &  none_message = "" 
)

Custom-filtered menu for inventory and nearby items and those that within specified radius.

Definition at line 398 of file game_inventory.cpp.

400{
402 title, radius, none_message );
403}
static item_location_filter convert_filter(const item_filter &filter)
static item_location inv_internal(player &u, const inventory_selector_preset &preset, const std::string &title, int radius, const std::string &none_message, const std::string &hint=std::string())
std::string title(holiday current_holiday)
Definition: path_info.cpp:334

References convert_filter(), inv_internal(), PATH_INFO::title(), and u.

◆ invalidate_main_ui_adaptor()

void game::invalidate_main_ui_adaptor ( ) const

◆ is_dangerous_tile()

bool game::is_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8657 of file game.cpp.

8658{
8659 return !( get_dangerous_tile( dest_loc ).empty() );
8660}
std::vector< std::string > get_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8679

References get_dangerous_tile().

Referenced by walk_move().

◆ is_empty()

bool game::is_empty ( const tripoint p)

Returns true if there is no player, NPC, or monster on the tile and move_cost > 0.

Definition at line 4802 of file game.cpp.

4803{
4804 return ( m.passable( p ) || m.has_flag( "LIQUID", p ) ) &&
4805 critter_at( p ) == nullptr;
4806}

References critter_at(), map::has_flag(), m, and map::passable().

Referenced by grabbed_furn_move(), monmove(), place_player(), and update_stair_monsters().

◆ is_game_over()

bool game::is_game_over ( )
private

Definition at line 2365 of file game.cpp.

2366{
2367 if( uquit == QUIT_WATCH ) {
2368 // deny player movement and dodging
2369 u.moves = 0;
2370 // prevent pain from updating
2371 u.set_pain( 0 );
2372 // prevent dodging
2373 u.dodges_left = 0;
2374 return false;
2375 }
2376 if( uquit == QUIT_DIED ) {
2377 if( u.in_vehicle ) {
2378 m.unboard_vehicle( u.pos() );
2379 }
2380 u.place_corpse();
2381 return true;
2382 }
2383 if( uquit == QUIT_SUICIDE ) {
2384 if( u.in_vehicle ) {
2385 m.unboard_vehicle( u.pos() );
2386 }
2387 return true;
2388 }
2389 if( uquit != QUIT_NO ) {
2390 return true;
2391 }
2392 // is_dead_state() already checks hp_torso && hp_head, no need to for loop it
2393 if( u.is_dead_state() ) {
2395 if( get_option<std::string>( "DEATHCAM" ) == "always" ) {
2396 uquit = QUIT_WATCH;
2397 } else if( get_option<std::string>( "DEATHCAM" ) == "ask" ) {
2398 uquit = query_yn( _( "Watch the last moments of your life…?" ) ) ?
2400 } else if( get_option<std::string>( "DEATHCAM" ) == "never" ) {
2401 uquit = QUIT_DIED;
2402 } else {
2403 // Something funky happened here, just die.
2404 dbg( DL::Error ) << "no deathcam option given to options, defaulting to QUIT_DIED";
2405 uquit = QUIT_DIED;
2406 }
2407 return is_game_over();
2408 }
2409 return false;
2410}
int dodges_left
Definition: character.h:561
void set_pain(int npain) override
Sets new intensity of pain an reacts to it.
Definition: character.cpp:777
@ Error
Error (default: enabled).
#define dbg(x)
Definition: game.cpp:198
void deactivate()
Definition: messages.cpp:357

References _, dbg, Messages::deactivate(), Character::dodges_left, Error, Character::in_vehicle, Character::is_dead_state(), is_game_over(), m, Creature::moves, Character::place_corpse(), Character::pos(), query_yn(), QUIT_DIED, QUIT_NO, QUIT_SUICIDE, QUIT_WATCH, Character::set_pain(), u, map::unboard_vehicle(), and uquit.

Referenced by do_turn(), and is_game_over().

◆ is_hostile_nearby()

Creature * game::is_hostile_nearby ( )

Definition at line 3561 of file game.cpp.

3562{
3563 int distance = ( get_option<int>( "SAFEMODEPROXIMITY" ) <= 0 ) ? MAX_VIEW_DISTANCE :
3564 get_option<int>( "SAFEMODEPROXIMITY" );
3565 return is_hostile_within( distance );
3566}
Creature * is_hostile_within(int distance)
Definition: game.cpp:3573

References is_hostile_within(), and MAX_VIEW_DISTANCE.

◆ is_hostile_very_close()

Creature * game::is_hostile_very_close ( )

Definition at line 3568 of file game.cpp.

3569{
3571}
static constexpr int DANGEROUS_PROXIMITY
Definition: game.cpp:200

References DANGEROUS_PROXIMITY, and is_hostile_within().

Referenced by butcher(), and process_voluntary_act_interrupt().

◆ is_hostile_within()

Creature * game::is_hostile_within ( int  distance)
private

Definition at line 3573 of file game.cpp.

3574{
3575 for( auto &critter : u.get_visible_creatures( distance ) ) {
3576 if( u.attitude_to( *critter ) == Creature::A_HOSTILE ) {
3577 return critter;
3578 }
3579 }
3580
3581 return nullptr;
3582}
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
std::vector< Creature * > get_visible_creatures(int range) const
Returns all creatures that this player can see and that are in the given range.
@ A_HOSTILE
Definition: creature.h:167

References Creature::A_HOSTILE, Character::attitude_to(), Character::get_visible_creatures(), and u.

Referenced by is_hostile_nearby(), and is_hostile_very_close().

◆ is_in_sunlight()

bool game::is_in_sunlight ( const tripoint p)

Returns true if p is outdoors and it is sunny.

Definition at line 4808 of file game.cpp.

4809{
4810 return weather::is_in_sunlight( m, p, get_weather().weather_id );
4811}
bool is_in_sunlight(const map &m, const tripoint &p, const weather_type_id &weather)
Definition: weather.cpp:1162

References get_weather, weather::is_in_sunlight(), and m.

Referenced by process_artifact().

◆ is_in_viewport()

bool game::is_in_viewport ( const tripoint p,
int  margin = 0 
) const

Definition at line 3207 of file game.cpp.

3208{
3209 const tripoint diff( u.pos() + u.view_offset - p );
3210
3211 return ( std::abs( diff.x ) <= getmaxx( w_terrain ) / 2 - margin ) &&
3212 ( std::abs( diff.y ) <= getmaxy( w_terrain ) / 2 - margin );
3213}

References catacurses::getmaxx(), catacurses::getmaxy(), Character::pos(), u, player::view_offset, w_terrain, tripoint::x, and tripoint::y.

◆ is_sheltered()

bool game::is_sheltered ( const tripoint p)

Returns true if p is indoors, underground, or in a car.

Definition at line 4813 of file game.cpp.

4814{
4815 return weather::is_sheltered( m, p );
4816}
bool is_sheltered(const map &m, const tripoint &p)
Definition: weather.cpp:1153

References weather::is_sheltered(), and m.

◆ is_zones_manager_open()

bool game::is_zones_manager_open ( ) const

Definition at line 5993 of file game.cpp.

5994{
5995 return zones_manager_open;
5996}
bool zones_manager_open
Is Zone manager open or not - changes graphics of some zone tiles.
Definition: game.h:1053

References zones_manager_open.

◆ item_action_menu()

void game::item_action_menu ( )
private

Definition at line 231 of file item_action.cpp.

232{
233 const auto &gen = item_action_generator::generator();
234 const action_map &item_actions = gen.get_item_action_map();
235
236 // HACK: A bit of a hack for now. If more pseudos get implemented, this should be un-hacked
237 std::vector<item *> pseudos;
238 item toolset( "toolset", calendar::turn );
239 if( u.has_active_bionic( bio_tools ) ) {
240 pseudos.push_back( &toolset );
241 }
242 item bio_claws_item( static_cast<std::string>( bio_claws_weapon ), calendar::turn );
243 if( u.has_active_bionic( bio_claws ) ) {
244 pseudos.push_back( &bio_claws_item );
245 }
246
247 item_action_map iactions = gen.map_actions_to_items( u, pseudos );
248 if( iactions.empty() ) {
249 popup( _( "You don't have any items with registered uses" ) );
250 }
251
252 uilist kmenu;
253 kmenu.text = _( "Execute which action?" );
254 kmenu.input_category = "ITEM_ACTIONS";
255 input_context ctxt( "ITEM_ACTIONS" );
256 for( const auto &id : item_actions ) {
257 ctxt.register_action( id.first, id.second.name );
258 kmenu.additional_actions.emplace_back( id.first, id.second.name );
259 }
260 actmenu_cb callback( item_actions );
261 kmenu.callback = &callback;
262 int num = 0;
263
264 const auto assigned_action = [&iactions]( const item_action_id & action ) {
265 return iactions.find( action ) != iactions.end();
266 };
267
268 std::vector<std::tuple<item_action_id, std::string, std::string>> menu_items;
269 // Sorts menu items by action.
270 using Iter = decltype( menu_items )::iterator;
271 const auto sort_menu = []( Iter from, Iter to ) {
272 std::sort( from, to, []( const std::tuple<item_action_id, std::string, std::string> &lhs,
273 const std::tuple<item_action_id, std::string, std::string> &rhs ) {
274 return std::get<1>( lhs ).compare( std::get<1>( rhs ) ) < 0;
275 } );
276 };
277 // Add mapped actions to the menu vector.
278 std::transform( iactions.begin(), iactions.end(), std::back_inserter( menu_items ),
279 []( const std::pair<item_action_id, item *> &elem ) {
280 std::string ss = elem.second->display_name();
281 if( elem.second->ammo_required() ) {
282 ss += string_format( " (%d/%d)", elem.second->ammo_required(), elem.second->ammo_remaining() );
283 }
284
285 const auto method = elem.second->get_use( elem.first );
286 if( method ) {
287 return std::make_tuple( method->get_type(), method->get_name(), ss );
288 } else {
289 return std::make_tuple( errstring, std::string( "NO USE FUNCTION" ), ss );
290 }
291 } );
292 // Sort mapped actions.
293 sort_menu( menu_items.begin(), menu_items.end() );
294 // Add unmapped but binded actions to the menu vector.
295 for( const auto &elem : item_actions ) {
296 if( key_bound_to( ctxt, elem.first ) != '\0' && !assigned_action( elem.first ) ) {
297 menu_items.emplace_back( elem.first, gen.get_action_name( elem.first ), "-" );
298 }
299 }
300 // Sort unmapped actions.
301 auto iter = menu_items.begin();
302 std::advance( iter, iactions.size() );
303 sort_menu( iter, menu_items.end() );
304 // Determine max lengths, to print the menu nicely.
305 std::pair<int, int> max_len;
306 for( const auto &elem : menu_items ) {
307 max_len.first = std::max( max_len.first, utf8_width( std::get<1>( elem ), true ) );
308 max_len.second = std::max( max_len.second, utf8_width( std::get<2>( elem ), true ) );
309 }
310 // Fill the menu.
311 for( const auto &elem : menu_items ) {
312 std::string ss;
313 ss += std::get<1>( elem );
314 ss += std::string( max_len.first - utf8_width( std::get<1>( elem ), true ), ' ' );
315 ss += std::string( 4, ' ' );
316
317 ss += std::get<2>( elem );
318 ss += std::string( max_len.second - utf8_width( std::get<2>( elem ), true ), ' ' );
319
320 const char bind = key_bound_to( ctxt, std::get<0>( elem ) );
321 const bool enabled = assigned_action( std::get<0>( elem ) );
322
323 kmenu.addentry( num, enabled, bind, ss );
324 num++;
325 }
326
327 kmenu.query();
328 if( kmenu.ret < 0 || kmenu.ret >= static_cast<int>( iactions.size() ) ) {
329 return;
330 }
331
332 const item_action_id action = std::get<0>( menu_items[kmenu.ret] );
333 item *it = iactions[action];
334
335 u.invoke_item( it, action );
336
337 u.inv.restack( u );
338 u.inv.unsort();
339}
inventory inv
Definition: character.h:1544
bool invoke_item(item *, const tripoint &pt) override
Asks how to use the item (if it has more than one use_method) and uses it.
Definition: avatar.cpp:1256
void restack(player &p)
Definition: inventory.cpp:399
void unsort()
Definition: inventory.cpp:227
static item_action_generator & generator()
Definition: item_action.h:32
std::string input_category
Definition: ui.h:325
std::vector< std::pair< std::string, translation > > additional_actions
Definition: ui.h:326
static char key_bound_to(const input_context &ctxt, const item_action_id &act)
Definition: item_action.cpp:47
static const bionic_id bio_claws("bio_claws")
static const bionic_id bio_tools("bio_tools")
static const bionic_id bio_claws_weapon("bio_claws_weapon")
std::string item_action_id
Definition: item_action.h:16
std::map< item_action_id, item_action > action_map
Definition: item_action.h:18
std::map< item_action_id, item * > item_action_map
Definition: item_action.h:17

References _, action, uilist::additional_actions, bio_claws, bio_claws_weapon, bio_tools, uilist::callback, item_action_generator::generator(), Character::has_active_bionic(), uilist::input_category, num, popup(), input_context::register_action(), second, uilist::text, iexamine::transform(), calendar::turn, and u.

Referenced by handle_action().

◆ knockback() [1/2]

void game::knockback ( const tripoint s,
const tripoint t,
int  force,
int  stun,
int  dam_mult,
Creature source 
)

Definition at line 4226 of file game.cpp.

4228{
4229 std::vector<tripoint> traj;
4230 traj.clear();
4231 traj = line_to( s, t, 0, 0 );
4232 traj.insert( traj.begin(), s ); // how annoying, line_to() doesn't include the originating point!
4233 traj = continue_line( traj, force );
4234 traj.insert( traj.begin(), t ); // how annoying, continue_line() doesn't either!
4235
4236 knockback( traj, stun, dam_mult, source );
4237}
std::vector< coords::coord_point< Point, Origin, Scale > > line_to(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:548
std::vector< tripoint > continue_line(const std::vector< tripoint > &line, const int distance)
Definition: line.cpp:408

References continue_line(), knockback(), and line_to().

Referenced by forced_door_closing(), and knockback().

◆ knockback() [2/2]

void game::knockback ( std::vector< tripoint > &  traj,
int  stun,
int  dam_mult,
Creature source = nullptr 
)

Definition at line 4243 of file game.cpp.

4245{
4246 // TODO: make the force parameter actually do something.
4247 // the header file says higher force causes more damage.
4248 // perhaps that is what it should do?
4249
4250 // TODO: refactor this so it's not copy/pasted 3 times
4251 tripoint tp = traj.front();
4252 if( !critter_at( tp ) ) {
4253 debugmsg( _( "Nothing at (%d,%d,%d) to knockback!" ), tp.x, tp.y, tp.z );
4254 return;
4255 }
4256 std::size_t force_remaining = traj.size();
4257 if( monster *const targ = critter_at<monster>( tp, true ) ) {
4258 if( stun > 0 ) {
4259 targ->add_effect( effect_stunned, 1_turns * stun );
4260 add_msg( _( "%s was stunned!" ), targ->name() );
4261 }
4262 for( size_t i = 1; i < traj.size(); i++ ) {
4263 if( m.impassable( traj[i].xy() ) || m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) {
4264 targ->setpos( traj[i - 1] );
4265 force_remaining = traj.size() - i;
4266 if( stun != 0 ) {
4267 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4268 add_msg( _( "%s was stunned!" ), targ->name() );
4269 add_msg( _( "%s slammed into an obstacle!" ), targ->name() );
4270 targ->apply_damage( source, bodypart_id( "torso" ), dam_mult * force_remaining );
4271 targ->check_dead_state();
4272 }
4273 m.bash( traj[i], 2 * dam_mult * force_remaining );
4274 break;
4275 } else if( critter_at( traj[i] ) ) {
4276 targ->setpos( traj[i - 1] );
4277 force_remaining = traj.size() - i;
4278 if( stun != 0 ) {
4279 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4280 add_msg( _( "%s was stunned!" ), targ->name() );
4281 }
4282 traj.erase( traj.begin(), traj.begin() + i );
4283 if( critter_at<monster>( traj.front() ) ) {
4284 add_msg( _( "%s collided with something else and sent it flying!" ),
4285 targ->name() );
4286 } else if( npc *const guy = critter_at<npc>( traj.front() ) ) {
4287 if( guy->male ) {
4288 add_msg( _( "%s collided with someone else and sent him flying!" ),
4289 targ->name() );
4290 } else {
4291 add_msg( _( "%s collided with someone else and sent her flying!" ),
4292 targ->name() );
4293 }
4294 } else if( u.pos() == traj.front() ) {
4295 add_msg( m_bad, _( "%s collided with you and sent you flying!" ), targ->name() );
4296 }
4297 knockback( traj, stun, dam_mult, source );
4298 break;
4299 }
4300 targ->setpos( traj[i] );
4301 if( m.has_flag( "LIQUID", targ->pos() ) && targ->can_drown() && !targ->is_dead() ) {
4302 targ->die( source );
4303 if( u.sees( *targ ) ) {
4304 add_msg( _( "The %s drowns!" ), targ->name() );
4305 }
4306 }
4307 if( !m.has_flag( "LIQUID", targ->pos() ) && targ->has_flag( MF_AQUATIC ) &&
4308 !targ->is_dead() ) {
4309 targ->die( source );
4310 if( u.sees( *targ ) ) {
4311 add_msg( _( "The %s flops around and dies!" ), targ->name() );
4312 }
4313 }
4314 tp = traj[i];
4315 }
4316 } else if( npc *const targ = critter_at<npc>( tp ) ) {
4317 if( stun > 0 ) {
4318 targ->add_effect( effect_stunned, 1_turns * stun );
4319 add_msg( _( "%s was stunned!" ), targ->name );
4320 }
4321 for( size_t i = 1; i < traj.size(); i++ ) {
4322 if( m.impassable( traj[i].xy() ) ||
4323 m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) { // oops, we hit a wall!
4324 targ->setpos( traj[i - 1] );
4325 force_remaining = traj.size() - i;
4326 if( stun != 0 ) {
4327 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4328 if( targ->has_effect( effect_stunned ) ) {
4329 add_msg( _( "%s was stunned!" ), targ->name );
4330 }
4331
4332 std::array<bodypart_id, 8> bps = {{
4333 bodypart_id( "head" ),
4334 bodypart_id( "arm_l" ), bodypart_id( "arm_r" ),
4335 bodypart_id( "hand_l" ), bodypart_id( "hand_r" ),
4336 bodypart_id( "torso" ),
4337 bodypart_id( "leg_l" ), bodypart_id( "leg_r" )
4338 }
4339 };
4340 for( const bodypart_id &bp : bps ) {
4341 if( one_in( 2 ) ) {
4342 targ->deal_damage( source, bp, damage_instance( DT_BASH, force_remaining * dam_mult ) );
4343 }
4344 }
4345 targ->check_dead_state();
4346 }
4347 m.bash( traj[i], 2 * dam_mult * force_remaining );
4348 break;
4349 } else if( critter_at( traj[i] ) ) {
4350 targ->setpos( traj[i - 1] );
4351 force_remaining = traj.size() - i;
4352 if( stun != 0 ) {
4353 add_msg( _( "%s was stunned!" ), targ->name );
4354 targ->add_effect( effect_stunned, 1_turns * force_remaining );
4355 }
4356 traj.erase( traj.begin(), traj.begin() + i );
4357 const tripoint &traj_front = traj.front();
4358 if( critter_at<monster>( traj_front ) ) {
4359 add_msg( _( "%s collided with something else and sent it flying!" ),
4360 targ->name );
4361 } else if( npc *const guy = critter_at<npc>( traj_front ) ) {
4362 if( guy->male ) {
4363 add_msg( _( "%s collided with someone else and sent him flying!" ),
4364 targ->name );
4365 } else {
4366 add_msg( _( "%s collided with someone else and sent her flying!" ),
4367 targ->name );
4368 }
4369 } else if( u.posx() == traj_front.x && u.posy() == traj_front.y &&
4371 ( u.footwear_factor() == .5 && one_in( 2 ) ) ) ) ) {
4372 add_msg( _( "%s collided with you, and barely dislodges your tentacles!" ), targ->name );
4373 } else if( u.posx() == traj_front.x && u.posy() == traj_front.y ) {
4374 add_msg( m_bad, _( "%s collided with you and sent you flying!" ), targ->name );
4375 }
4376 knockback( traj, stun, dam_mult, source );
4377 break;
4378 }
4379 targ->setpos( traj[i] );
4380 tp = traj[i];
4381 }
4382 } else if( u.pos() == tp ) {
4383 if( stun > 0 ) {
4384 u.add_effect( effect_stunned, 1_turns * stun );
4385 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4386 "You were stunned for %d turns!",
4387 stun ),
4388 stun );
4389 }
4390 for( size_t i = 1; i < traj.size(); i++ ) {
4391 if( m.impassable( traj[i] ) ||
4392 m.obstructed_by_vehicle_rotation( tp, traj[i] ) ) { // oops, we hit a wall!
4393 u.setpos( traj[i - 1] );
4394 force_remaining = traj.size() - i;
4395 if( stun != 0 ) {
4396 if( u.has_effect( effect_stunned ) ) {
4397 add_msg( m_bad, vgettext( "You were stunned AGAIN for %d turn!",
4398 "You were stunned AGAIN for %d turns!",
4399 force_remaining ),
4400 force_remaining );
4401 } else {
4402 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4403 "You were stunned for %d turns!",
4404 force_remaining ),
4405 force_remaining );
4406 }
4407 u.add_effect( effect_stunned, 1_turns * force_remaining );
4408 std::array<bodypart_id, 8> bps = {{
4409 bodypart_id( "head" ),
4410 bodypart_id( "arm_l" ), bodypart_id( "arm_r" ),
4411 bodypart_id( "hand_l" ), bodypart_id( "hand_r" ),
4412 bodypart_id( "torso" ),
4413 bodypart_id( "leg_l" ), bodypart_id( "leg_r" )
4414 }
4415 };
4416 for( const bodypart_id &bp : bps ) {
4417 if( one_in( 2 ) ) {
4418 u.deal_damage( source, bp, damage_instance( DT_BASH, force_remaining * dam_mult ) );
4419 }
4420 }
4422 }
4423 m.bash( traj[i], 2 * dam_mult * force_remaining );
4424 break;
4425 } else if( critter_at( traj[i] ) ) {
4426 u.setpos( traj[i - 1] );
4427 force_remaining = traj.size() - i;
4428 if( stun != 0 ) {
4429 if( u.has_effect( effect_stunned ) ) {
4430 add_msg( m_bad, vgettext( "You were stunned AGAIN for %d turn!",
4431 "You were stunned AGAIN for %d turns!",
4432 force_remaining ),
4433 force_remaining );
4434 } else {
4435 add_msg( m_bad, vgettext( "You were stunned for %d turn!",
4436 "You were stunned for %d turns!",
4437 force_remaining ),
4438 force_remaining );
4439 }
4440 u.add_effect( effect_stunned, 1_turns * force_remaining );
4441 }
4442 traj.erase( traj.begin(), traj.begin() + i );
4443 if( critter_at<monster>( traj.front() ) ) {
4444 add_msg( _( "You collided with something and sent it flying!" ) );
4445 } else if( npc *const guy = critter_at<npc>( traj.front() ) ) {
4446 if( guy->male ) {
4447 add_msg( _( "You collided with someone and sent him flying!" ) );
4448 } else {
4449 add_msg( _( "You collided with someone and sent her flying!" ) );
4450 }
4451 }
4452 knockback( traj, stun, dam_mult, source );
4453 break;
4454 }
4455 if( m.has_flag( "LIQUID", u.pos() ) && force_remaining == 0 ) {
4456 avatar_action::swim( m, u, u.pos() );
4457 } else {
4458 u.setpos( traj[i] );
4459 }
4460
4461 tp = traj[i];
4462 }
4463 }
4464}
double footwear_factor() const
Returns 1 if the player is wearing something on both feet, .5 if on one, and 0 if on neither.
Definition: character.cpp:8891
dealt_damage_instance deal_damage(Creature *source, bodypart_id bp, const damage_instance &d) override
Calls Creature::deal_damage and handles damaged effects (waking up, etc.)
Definition: character.cpp:8419
void add_effect(const effect &eff, bool force=false, bool deferred=false)
Definition: creature.cpp:986
@ DT_BASH
Definition: damage.h:24
static const trait_id trait_LEG_TENT_BRACE("LEG_TENT_BRACE")
static const efftype_id effect_stunned("stunned")
@ MF_AQUATIC
Definition: mtype.h:89
void swim(map &m, avatar &you, const tripoint &p)
Handles swimming by the player.
const char * vgettext(const char *msgid, const char *msgid_plural, size_t n)

References _, Creature::add_effect(), add_msg(), map::bash(), Creature::check_dead_state(), critter_at(), Character::deal_damage(), debugmsg, DT_BASH, effect_stunned, Character::footwear_factor(), Creature::has_effect(), map::has_flag(), Character::has_trait(), map::impassable(), knockback(), m, m_bad, MF_AQUATIC, map::obstructed_by_vehicle_rotation(), one_in(), Character::pos(), Character::posx(), Character::posy(), Character::sees(), Character::setpos(), avatar_action::swim(), trait_LEG_TENT_BRACE, u, vgettext(), tripoint::x, tripoint::y, and tripoint::z.

◆ light_level()

unsigned char game::light_level ( int  zlev) const

Returns coarse number-of-squares of visibility at the current light level.

Used by monster and NPC AI.

Definition at line 3540 of file game.cpp.

3541{
3542 const float light = natural_light_level( zlev );
3543 return LIGHT_RANGE( light );
3544}
float natural_light_level(int zlev) const
Definition: game.cpp:3480
#define LIGHT_RANGE(b)
Definition: lightmap.h:41

References light, LIGHT_RANGE, and natural_light_level().

Referenced by calc_driving_offset(), and update_overmap_seen().

◆ list_active_characters()

std::vector< std::string > game::list_active_characters ( )

Returns a list of currently active character saves.

Definition at line 2747 of file game.cpp.

2748{
2749 std::vector<std::string> saves;
2750 for( auto &worldsave : world_generator->active_world->world_saves ) {
2751 saves.push_back( worldsave.player_name() );
2752 }
2753 return saves;
2754}

References world_generator.

Referenced by cleanup_at_end().

◆ list_items()

game::vmenu_ret game::list_items ( const std::vector< map_item_stack > &  item_list)
private

Definition at line 7236 of file game.cpp.

7237{
7238 std::vector<map_item_stack> ground_items = item_list;
7239 int iInfoHeight = 0;
7240 int iMaxRows = 0;
7241 int width = 0;
7242 int max_name_width = 0;
7243
7244 //find max length of item name and resize window width
7245 for( const map_item_stack &cur_item : ground_items ) {
7246 const int item_len = utf8_width( remove_color_tags( cur_item.example->display_name() ) ) + 15;
7247 if( item_len > max_name_width ) {
7248 max_name_width = item_len;
7249 }
7250 }
7251
7252 tripoint active_pos;
7253 map_item_stack *activeItem = nullptr;
7254
7255 catacurses::window w_items;
7256 catacurses::window w_items_border;
7257 catacurses::window w_item_info;
7258
7259 ui_adaptor ui;
7260 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
7261 iInfoHeight = std::min( 25, TERMY / 2 );
7262 iMaxRows = TERMY - iInfoHeight - 2;
7263
7264 width = clamp( max_name_width, 45, TERMX / 3 );
7265
7266 const int offsetX = TERMX - width;
7267
7268 w_items = catacurses::newwin( TERMY - 2 - iInfoHeight,
7269 width - 2, point( offsetX + 1, 1 ) );
7270 w_items_border = catacurses::newwin( TERMY - iInfoHeight,
7271 width, point( offsetX, 0 ) );
7272 w_item_info = catacurses::newwin( iInfoHeight, width,
7273 point( offsetX, TERMY - iInfoHeight ) );
7274
7275 if( activeItem ) {
7276 centerlistview( active_pos, width );
7277 }
7278
7279 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
7280 } );
7281 ui.mark_resize();
7282
7283 // use previously selected sorting method
7284 bool sort_radius = uistate.list_item_sort != 2;
7285 bool addcategory = !sort_radius;
7286
7287 // reload filter/priority settings on the first invocation, if they were active
7288 if( !uistate.list_item_init ) {
7291 }
7294 }
7297 }
7298 uistate.list_item_init = true;
7299 }
7300
7301 //this stores only those items that match our filter
7302 std::vector<map_item_stack> filtered_items =
7303 !sFilter.empty() ? filter_item_stacks( ground_items, sFilter ) : ground_items;
7304 int highPEnd = list_filter_high_priority( filtered_items, list_item_upvote );
7305 int lowPStart = list_filter_low_priority( filtered_items, highPEnd, list_item_downvote );
7306 int iItemNum = ground_items.size();
7307
7308 const tripoint stored_view_offset = u.view_offset;
7309
7311
7312 int iActive = 0; // Item index that we're looking at
7313 bool refilter = true;
7314 int page_num = 0;
7315 int iCatSortNum = 0;
7316 int iScrollPos = 0;
7317 std::map<int, std::string> mSortCategory;
7318
7319 std::string action;
7320 input_context ctxt( "LIST_ITEMS" );
7321 ctxt.register_action( "UP", to_translation( "Move cursor up" ) );
7322 ctxt.register_action( "DOWN", to_translation( "Move cursor down" ) );
7323 ctxt.register_action( "LEFT", to_translation( "Previous item" ) );
7324 ctxt.register_action( "RIGHT", to_translation( "Next item" ) );
7325 ctxt.register_action( "PAGE_DOWN" );
7326 ctxt.register_action( "PAGE_UP" );
7327 ctxt.register_action( "NEXT_TAB" );
7328 ctxt.register_action( "PREV_TAB" );
7329 ctxt.register_action( "HELP_KEYBINDINGS" );
7330 ctxt.register_action( "QUIT" );
7331 ctxt.register_action( "FILTER" );
7332 ctxt.register_action( "RESET_FILTER" );
7333 ctxt.register_action( "EXAMINE" );
7334 ctxt.register_action( "COMPARE" );
7335 ctxt.register_action( "PRIORITY_INCREASE" );
7336 ctxt.register_action( "PRIORITY_DECREASE" );
7337 ctxt.register_action( "SORT" );
7338 ctxt.register_action( "TRAVEL_TO" );
7339
7341
7342 ui.on_redraw( [&]( const ui_adaptor & ) {
7343 reset_item_list_state( w_items_border, iInfoHeight, sort_radius );
7344
7345 if( ground_items.empty() ) {
7346 wnoutrefresh( w_items_border );
7347 mvwprintz( w_items, point( 2, 10 ), c_white, _( "You don't see any items around you!" ) );
7348 } else {
7349 int iStartPos = 0;
7350 werase( w_items );
7351 calcStartPos( iStartPos, iActive, iMaxRows, iItemNum );
7352 int iNum = 0;
7353 bool high = false;
7354 bool low = false;
7355 int index = 0;
7356 int iCatSortOffset = 0;
7357
7358 for( int i = 0; i < iStartPos; i++ ) {
7359 if( !mSortCategory[i].empty() ) {
7360 iNum++;
7361 }
7362 }
7363 for( auto iter = filtered_items.begin(); iter != filtered_items.end(); ++index ) {
7364 if( highPEnd > 0 && index < highPEnd + iCatSortOffset ) {
7365 high = true;
7366 low = false;
7367 } else if( index >= lowPStart + iCatSortOffset ) {
7368 high = false;
7369 low = true;
7370 } else {
7371 high = false;
7372 low = false;
7373 }
7374
7375 if( iNum >= iStartPos && iNum < iStartPos + ( iMaxRows > iItemNum ? iItemNum : iMaxRows ) ) {
7376 int iThisPage = 0;
7377 if( !mSortCategory[iNum].empty() ) {
7378 iCatSortOffset++;
7379 mvwprintz( w_items, point( 1, iNum - iStartPos ), c_magenta, mSortCategory[iNum] );
7380 } else {
7381 if( iNum == iActive ) {
7382 iThisPage = page_num;
7383 }
7384 std::string sText;
7385 if( iter->vIG.size() > 1 ) {
7386 sText += string_format( "[%d/%d] (%d) ", iThisPage + 1, iter->vIG.size(), iter->totalcount );
7387 }
7388 sText += iter->example->tname();
7389 if( iter->vIG[iThisPage].count > 1 ) {
7390 sText += string_format( "[%d]", iter->vIG[iThisPage].count );
7391 }
7392
7393 nc_color col = c_light_green;
7394 if( iNum != iActive ) {
7395 if( high ) {
7396 col = c_yellow;
7397 } else if( low ) {
7398 col = c_red;
7399 } else {
7400 col = iter->example->color_in_inventory();
7401 }
7402 }
7403 trim_and_print( w_items, point( 1, iNum - iStartPos ), width - 9, col, sText );
7404 const int numw = iItemNum > 9 ? 2 : 1;
7405 const int x = iter->vIG[iThisPage].pos.x;
7406 const int y = iter->vIG[iThisPage].pos.y;
7407 mvwprintz( w_items, point( width - 6 - numw, iNum - iStartPos ),
7408 iNum == iActive ? c_light_green : c_light_gray,
7409 "%*d %s", numw, rl_dist( point_zero, point( x, y ) ),
7411 ++iter;
7412 }
7413 } else {
7414 ++iter;
7415 }
7416 iNum++;
7417 }
7418 iNum = 0;
7419 for( int i = 0; i < iActive; i++ ) {
7420 if( !mSortCategory[i].empty() ) {
7421 iNum++;
7422 }
7423 }
7424 mvwprintz( w_items_border, point( ( width - 9 ) / 2 + ( iItemNum > 9 ? 0 : 1 ), 0 ),
7425 c_light_green, " %*d", iItemNum > 9 ? 2 : 1, iItemNum > 0 ? iActive - iNum + 1 : 0 );
7426 wprintz( w_items_border, c_white, " / %*d ", iItemNum > 9 ? 2 : 1, iItemNum - iCatSortNum );
7427 werase( w_item_info );
7428
7429 if( iItemNum > 0 && activeItem ) {
7430 item_location loc( map_cursor( u.pos() + activeItem->example_item_pos ),
7431 const_cast<item *>( activeItem->example ) );
7433 std::vector<iteminfo> this_item = activeItem->example->info( temperature );
7434 std::vector<iteminfo> item_info_dummy;
7435
7436 item_info_data dummy( "", "", this_item, item_info_dummy, iScrollPos );
7437 dummy.without_getch = true;
7438 dummy.without_border = true;
7439
7440 draw_item_info( w_item_info, dummy );
7441 }
7442 draw_scrollbar( w_items_border, iActive, iMaxRows, iItemNum, point_south );
7443 wnoutrefresh( w_items_border );
7444 }
7445
7446 const bool bDrawLeft = ground_items.empty() || filtered_items.empty() || !activeItem || filter_type;
7447 draw_custom_border( w_item_info, bDrawLeft, true, true, true, LINE_XXXO, LINE_XOXX, true, true );
7448
7449 if( iItemNum > 0 && activeItem ) {
7450 // print info window title: < item name >
7451 mvwprintw( w_item_info, point( 2, 0 ), "< " );
7452 trim_and_print( w_item_info, point( 4, 0 ), width - 8, activeItem->example->color_in_inventory(),
7453 activeItem->example->display_name() );
7454 wprintw( w_item_info, " >" );
7455 }
7456
7457 wnoutrefresh( w_items );
7458 wnoutrefresh( w_item_info );
7459
7460 if( filter_type ) {
7461 draw_item_filter_rules( w_item_info, 0, iInfoHeight - 1, filter_type.value() );
7462 }
7463 } );
7464
7465 cata::optional<tripoint> trail_start;
7466 cata::optional<tripoint> trail_end;
7467 bool trail_end_x = false;
7468 shared_ptr_fast<draw_callback_t> trail_cb = create_trail_callback( trail_start, trail_end,
7469 trail_end_x );
7470 add_draw_callback( trail_cb );
7471
7472 do {
7473 if( action == "COMPARE" && activeItem ) {
7474 game_menus::inv::compare( u, active_pos );
7475 } else if( action == "FILTER" ) {
7476 filter_type = item_filter_type::FILTER;
7477 ui.invalidate_ui();
7479 .title( _( "Filter:" ) )
7480 .width( 55 )
7481 .description( _( "UP: history, CTRL-U: clear line, ESC: abort, ENTER: save" ) )
7482 .identifier( "item_filter" )
7483 .max_length( 256 )
7484 .edit( sFilter );
7485 refilter = true;
7486 addcategory = !sort_radius;
7488 filter_type = cata::nullopt;
7489 } else if( action == "RESET_FILTER" ) {
7490 sFilter.clear();
7491 filtered_items = ground_items;
7492 refilter = true;
7494 addcategory = !sort_radius;
7495 } else if( action == "EXAMINE" && !filtered_items.empty() && activeItem ) {
7496 std::vector<iteminfo> dummy;
7497 const item *example_item = activeItem->example;
7498 // TODO: const_item_location
7499 item_location loc = item_location( u, const_cast<item *>( example_item ) );
7501 std::vector<iteminfo> this_item = example_item->info( temperature );
7502
7503 item_info_data info_data( example_item->tname(), example_item->type_name(), this_item, dummy );
7504 info_data.handle_scrolling = true;
7505
7507 return catacurses::newwin( TERMY, width - 5, point_zero );
7508 }, info_data );
7509 } else if( action == "PRIORITY_INCREASE" ) {
7510 filter_type = item_filter_type::HIGH_PRIORITY;
7511 ui.invalidate_ui();
7513 .title( _( "High Priority:" ) )
7514 .width( 55 )
7516 .description( _( "UP: history, CTRL-U clear line, ESC: abort, ENTER: save" ) )
7517 .identifier( "list_item_priority" )
7518 .max_length( 256 )
7519 .query_string();
7520 refilter = true;
7521 addcategory = !sort_radius;
7523 filter_type = cata::nullopt;
7524 } else if( action == "PRIORITY_DECREASE" ) {
7525 filter_type = item_filter_type::LOW_PRIORITY;
7526 ui.invalidate_ui();
7528 .title( _( "Low Priority:" ) )
7529 .width( 55 )
7531 .description( _( "UP: history, CTRL-U clear line, ESC: abort, ENTER: save" ) )
7532 .identifier( "list_item_downvote" )
7533 .max_length( 256 )
7534 .query_string();
7535 refilter = true;
7536 addcategory = !sort_radius;
7538 filter_type = cata::nullopt;
7539 } else if( action == "SORT" ) {
7540 if( sort_radius ) {
7541 sort_radius = false;
7542 addcategory = true;
7543 uistate.list_item_sort = 2; // list is sorted by category
7544 } else {
7545 sort_radius = true;
7546 uistate.list_item_sort = 1; // list is sorted by distance
7547 }
7548 highPEnd = -1;
7549 lowPStart = -1;
7550 iCatSortNum = 0;
7551
7552 mSortCategory.clear();
7553 refilter = true;
7554 } else if( action == "TRAVEL_TO" && activeItem ) {
7555 if( !u.sees( u.pos() + active_pos ) ) {
7556 add_msg( _( "You can't see that destination." ) );
7557 }
7558 auto route = m.route( u.pos(), u.pos() + active_pos, u.get_pathfinding_settings(),
7559 u.get_path_avoid() );
7560 if( route.size() > 1 ) {
7561 route.pop_back();
7562 u.set_destination( route );
7563 break;
7564 } else {
7565 add_msg( m_info, _( "You can't travel there." ) );
7566 }
7567 }
7568 if( uistate.list_item_sort == 1 ) {
7569 ground_items = item_list;
7570 } else if( uistate.list_item_sort == 2 ) {
7571 std::sort( ground_items.begin(), ground_items.end(), map_item_stack::map_item_stack_sort );
7572 }
7573
7574 if( refilter ) {
7575 refilter = false;
7576 filtered_items = filter_item_stacks( ground_items, sFilter );
7577 highPEnd = list_filter_high_priority( filtered_items, list_item_upvote );
7578 lowPStart = list_filter_low_priority( filtered_items, highPEnd, list_item_downvote );
7579 iActive = 0;
7580 page_num = 0;
7581 iItemNum = filtered_items.size();
7582 }
7583
7584 if( addcategory ) {
7585 addcategory = false;
7586 iCatSortNum = 0;
7587 mSortCategory.clear();
7588 if( highPEnd > 0 ) {
7589 mSortCategory[0] = _( "HIGH PRIORITY" );
7590 iCatSortNum++;
7591 }
7592 std::string last_cat_name;
7593 for( int i = std::max( 0, highPEnd );
7594 i < std::min( lowPStart, static_cast<int>( filtered_items.size() ) ); i++ ) {
7595 const std::string &cat_name = filtered_items[i].example->get_category().name();
7596 if( cat_name != last_cat_name ) {
7597 mSortCategory[i + iCatSortNum++] = cat_name;
7598 last_cat_name = cat_name;
7599 }
7600 }
7601 if( lowPStart < static_cast<int>( filtered_items.size() ) ) {
7602 mSortCategory[lowPStart + iCatSortNum++] = _( "LOW PRIORITY" );
7603 }
7604 if( !mSortCategory[0].empty() ) {
7605 iActive++;
7606 }
7607 iItemNum = static_cast<int>( filtered_items.size() ) + iCatSortNum;
7608 }
7609
7610 if( action == "UP" ) {
7611 do {
7612 iActive--;
7613
7614 } while( !mSortCategory[iActive].empty() );
7615 iScrollPos = 0;
7616 page_num = 0;
7617 if( iActive < 0 ) {
7618 iActive = iItemNum - 1;
7619 }
7620 } else if( action == "DOWN" ) {
7621 do {
7622 iActive++;
7623
7624 } while( !mSortCategory[iActive].empty() );
7625 iScrollPos = 0;
7626 page_num = 0;
7627 if( iActive >= iItemNum ) {
7628 iActive = mSortCategory[0].empty() ? 0 : 1;
7629 }
7630 } else if( action == "RIGHT" ) {
7631 if( !filtered_items.empty() && activeItem ) {
7632 if( ++page_num >= static_cast<int>( activeItem->vIG.size() ) ) {
7633 page_num = activeItem->vIG.size() - 1;
7634 }
7635 }
7636 } else if( action == "LEFT" ) {
7637 page_num = std::max( 0, page_num - 1 );
7638 } else if( action == "PAGE_UP" ) {
7639 iScrollPos--;
7640 } else if( action == "PAGE_DOWN" ) {
7641 iScrollPos++;
7642 } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) {
7643 u.view_offset = stored_view_offset;
7645 }
7646
7647 active_pos = tripoint_zero;
7648 activeItem = nullptr;
7649
7650 if( mSortCategory[iActive].empty() ) {
7651 auto iter = filtered_items.begin();
7652 for( int iNum = 0; iter != filtered_items.end() && iNum < iActive; iNum++ ) {
7653 if( mSortCategory[iNum].empty() ) {
7654 ++iter;
7655 }
7656 }
7657 if( iter != filtered_items.end() ) {
7658 active_pos = iter->vIG[page_num].pos;
7659 activeItem = &( *iter );
7660 }
7661 }
7662
7663 if( activeItem ) {
7664 centerlistview( active_pos, width );
7665 trail_start = u.pos();
7666 trail_end = u.pos() + active_pos;
7667 // Actually accessed from the terrain overlay callback `trail_cb` in the
7668 // call to `ui_manager::redraw`.
7669 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
7670 trail_end_x = true;
7671 } else {
7672 u.view_offset = stored_view_offset;
7673 trail_start = trail_end = cata::nullopt;
7674 }
7676
7678
7679 action = ctxt.handle_input();
7680 } while( action != "QUIT" );
7681
7682 u.view_offset = stored_view_offset;
7683 return game::vmenu_ret::QUIT;
7684}
constexpr T clamp(const T &val, const T &min, const T &max)
Clamp first argument so that it is no lower than second and no higher than third.
Definition: cata_utility.h:145
std::string list_item_upvote
Definition: game.h:1031
std::string list_item_downvote
Definition: game.h:1032
std::string sFilter
Definition: game.h:1030
void reset_item_list_state(const catacurses::window &window, int height, bool bRadiusSort)
Definition: game.cpp:7122
std::vector< iteminfo > info() const
Return all the information about the item and its type as a vector.
Definition: item.cpp:3963
nc_color color_in_inventory() const
Returns the color of the item depending on usefulness for the player character, e....
Definition: item.cpp:4119
std::string type_name(unsigned int quantity=1) const
Name of the item type (not the item), with proper plural.
Definition: item.cpp:9851
static bool map_item_stack_sort(const map_item_stack &lhs, const map_item_stack &rhs)
std::vector< item_group > vIG
const item * example
tripoint example_item_pos
string_input_popup & identifier(const std::string &value)
An identifier to be used to store / get the input history.
string_input_popup & text(const std::string &value)
Set / get the text that can be modified by the user.
void edit(std::string &value)
Edit values in place.
string_input_popup & width(int value)
Width (in console cells) of the input field itself.
string_input_popup & description(const std::string &value)
Additional help text, shown below the input box.
string_input_popup & title(const std::string &value)
The title: short string before the actual input field.
std::string list_item_priority
Definition: uistate.h:120
int list_item_sort
Definition: uistate.h:117
bool list_item_downvote_active
Definition: uistate.h:123
bool list_item_init
Definition: uistate.h:125
bool list_item_filter_active
Definition: uistate.h:122
std::string list_item_filter
Definition: uistate.h:118
bool list_item_priority_active
Definition: uistate.h:124
std::string list_item_downvote
Definition: uistate.h:119
direction direction_from(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:540
temperature_flag
Definition: enums.h:42
static shared_ptr_fast< game::draw_callback_t > create_trail_callback(const cata::optional< tripoint > &trail_start, const cata::optional< tripoint > &trail_end, const bool &trail_end_x)
Definition: game.cpp:3060
uistatedata uistate
Definition: game.cpp:284
static void centerlistview(const tripoint &active_item_position, int ui_width)
Definition: game.cpp:6967
std::string direction_name_short(const direction dir)
Definition: line.cpp:533
int list_filter_high_priority(std::vector< map_item_stack > &stack, const std::string &priorities)
std::vector< map_item_stack > filter_item_stacks(const std::vector< map_item_stack > &stack, const std::string &filter)
int list_filter_low_priority(std::vector< map_item_stack > &stack, const int start, const std::string &priorities)
void mvwprintw(const window &win, const point &p, const std::string &text)
void wprintw(const window &win, const std::string &text)
temperature_flag temperature_flag_for_location(const map &m, const item_location &loc)
Definition: rot.cpp:12
quantity< int, temperature_in_millidegree_celsius_tag > temperature
void calcStartPos(int &iStartPos, const int iCurrentLine, const int iContentHeight, const int iNumEntries)
Definition: output.cpp:1507
void draw_item_filter_rules(const catacurses::window &win, int starty, int height, item_filter_type type)
Write some tips (such as precede items with - to exclude them) onto the window.
Definition: output.cpp:810
void draw_scrollbar(const catacurses::window &window, const int iCurrentLine, const int iContentHeight, const int iNumLines, const point &offset, nc_color bar_color, const bool bDoNotScrollToEnd)
Draw a scrollbar (Legacy function, use class scrollbar instead!)
Definition: output.cpp:1314
std::string remove_color_tags(const std::string &s)
Removes the color tags from the input string.
Definition: output.cpp:145
void draw_custom_border(const catacurses::window &w, const catacurses::chtype ls, const catacurses::chtype rs, const catacurses::chtype ts, const catacurses::chtype bs, const catacurses::chtype tl, const catacurses::chtype tr, const catacurses::chtype bl, const catacurses::chtype br, const nc_color FG, const point &pos, int height, int width)
Definition: output.cpp:524
void trim_and_print(const catacurses::window &w, const point &begin, const int width, const nc_color &base_color, const std::string &text, const report_color_error color_error)
Prints a single line of text.
Definition: output.cpp:214
input_event draw_item_info(const int iLeft, const int iWidth, const int iTop, const int iHeight, item_info_data &data)
Definition: output.cpp:793
#define LINE_XOXX
Definition: output.h:47
#define LINE_XXXO
Definition: output.h:45

References _, action, add_draw_callback(), add_msg(), c_light_gray, c_light_green, c_magenta, c_red, c_white, c_yellow, calcStartPos(), centerlistview(), CHANGE_TAB, clamp(), item::color_in_inventory(), game_menus::inv::compare(), create_trail_callback(), string_input_popup::description(), direction_from(), direction_name_short(), item::display_name(), draw_custom_border(), draw_item_filter_rules(), draw_item_info(), draw_scrollbar(), string_input_popup::edit(), map_item_stack::example, map_item_stack::example_item_pos, FILTER, filter_item_stacks(), Character::get_path_avoid(), Character::get_pathfinding_settings(), input_context::handle_input(), item_info_data::handle_scrolling, high, HIGH_PRIORITY, string_input_popup::identifier(), item::info(), invalidate_main_ui_adaptor(), LINE_XOXX, LINE_XXXO, list_filter_high_priority(), list_filter_low_priority(), list_item_downvote, uistatedata::list_item_downvote, uistatedata::list_item_downvote_active, uistatedata::list_item_filter, uistatedata::list_item_filter_active, uistatedata::list_item_init, uistatedata::list_item_priority, uistatedata::list_item_priority_active, uistatedata::list_item_sort, list_item_upvote, LOW_PRIORITY, m, m_info, map_item_stack::map_item_stack_sort(), string_input_popup::max_length(), catacurses::mvwprintw(), mvwprintz(), catacurses::newwin(), cata::nullopt, point_south, point_zero, Character::pos(), string_input_popup::query_string(), QUIT, ui_manager::redraw(), input_context::register_action(), remove_color_tags(), reset_item_list_state(), rl_dist(), map::route(), Character::sees(), Character::set_destination(), sFilter, string_format(), rot::temperature_flag_for_location(), TERMX, TERMY, string_input_popup::text(), string_input_popup::title(), item::tname(), to_translation(), trim_and_print(), tripoint_zero, item::type_name(), u, uistate, utf8_width(), cata::optional< T >::value(), player::view_offset, map_item_stack::vIG, catacurses::werase(), string_input_popup::width(), item_info_data::without_border, item_info_data::without_getch, catacurses::wnoutrefresh(), catacurses::wprintw(), and wprintz().

Referenced by list_items_monsters().

◆ list_items_monsters()

void game::list_items_monsters ( )
private

Definition at line 7191 of file game.cpp.

7192{
7193 std::vector<Creature *> mons = u.get_visible_creatures( current_daylight_level( calendar::turn ) );
7194 // whole reality bubble
7195 const std::vector<map_item_stack> items = find_nearby_items( 60 );
7196
7197 if( mons.empty() && items.empty() ) {
7198 add_msg( m_info, _( "You don't see any items or monsters around you!" ) );
7199 return;
7200 }
7201
7202 std::sort( mons.begin(), mons.end(), [&]( const Creature * lhs, const Creature * rhs ) {
7203 const auto att_lhs = lhs->attitude_to( u );
7204 const auto att_rhs = rhs->attitude_to( u );
7205
7206 return att_lhs < att_rhs || ( att_lhs == att_rhs
7207 && rl_dist( u.pos(), lhs->pos() ) < rl_dist( u.pos(), rhs->pos() ) );
7208 } );
7209
7210 // If the current list is empty, switch to the non-empty list
7212 if( items.empty() ) {
7213 uistate.vmenu_show_items = false;
7214 }
7215 } else if( mons.empty() ) {
7217 }
7218
7221 while( true ) {
7222 ret = uistate.vmenu_show_items ? list_items( items ) : list_monsters( mons );
7225 } else {
7226 break;
7227 }
7228 }
7229
7230 if( ret == game::vmenu_ret::FIRE ) {
7232 }
7234}
double current_daylight_level(const time_point &p)
Returns the current seasonally-adjusted maximum daylight level.
Definition: calendar.cpp:171
game::vmenu_ret list_monsters(const std::vector< Creature * > &monster_list)
Definition: game.cpp:7686
game::vmenu_ret list_items(const std::vector< map_item_stack > &item_list)
Definition: game.cpp:7236
vmenu_ret
Definition: game.h:769
std::vector< map_item_stack > find_nearby_items(int iRadius)
Definition: game.cpp:6890
void temp_exit_fullscreen()
Definition: game.cpp:453
void reenter_fullscreen()
Definition: game.cpp:463
bool vmenu_show_items
Definition: uistate.h:121

References _, add_msg(), CHANGE_TAB, current_daylight_level(), find_nearby_items(), FIRE, avatar_action::fire_wielded_weapon(), Character::get_visible_creatures(), list_items(), list_monsters(), m_info, reenter_fullscreen(), cata::hash64_detail::ret, temp_exit_fullscreen(), calendar::turn, u, uistate, and uistatedata::vmenu_show_items.

Referenced by handle_action(), and look_around().

◆ list_missions()

void game::list_missions ( )

Definition at line 22 of file mission_ui.cpp.

23{
24 catacurses::window w_missions;
25
26 enum class tab_mode : int {
27 TAB_ACTIVE = 0,
28 TAB_COMPLETED,
29 TAB_FAILED,
30 NUM_TABS,
31 FIRST_TAB = 0,
32 LAST_TAB = NUM_TABS - 1
33 };
34 tab_mode tab = tab_mode::FIRST_TAB;
35 size_t selection = 0;
36 int entries_per_page = 0;
37 input_context ctxt( "MISSIONS" );
38 ctxt.register_cardinal();
39 ctxt.register_action( "CONFIRM" );
40 ctxt.register_action( "QUIT" );
41 ctxt.register_action( "HELP_KEYBINDINGS" );
42
44 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
46
47 // content ranges from y=3 to FULL_SCREEN_HEIGHT - 2
48 entries_per_page = FULL_SCREEN_HEIGHT - 4;
49
50 ui.position_from_window( w_missions );
51 } );
52 ui.mark_resize();
53
54 std::vector<mission *> umissions;
55
56 ui.on_redraw( [&]( const ui_adaptor & ) {
57 werase( w_missions );
58 // entries_per_page * page number
59 const int top_of_page = entries_per_page * ( selection / entries_per_page );
60 const int bottom_of_page =
61 std::min( top_of_page + entries_per_page - 1, static_cast<int>( umissions.size() ) - 1 );
62
63 for( int i = 3; i < FULL_SCREEN_HEIGHT - 1; i++ ) {
64 mvwputch( w_missions, point( 30, i ), BORDER_COLOR, LINE_XOXO );
65 }
66
67 const std::vector<std::pair<tab_mode, std::string>> tabs = {
68 { tab_mode::TAB_ACTIVE, _( "ACTIVE MISSIONS" ) },
69 { tab_mode::TAB_COMPLETED, _( "COMPLETED MISSIONS" ) },
70 { tab_mode::TAB_FAILED, _( "FAILED MISSIONS" ) },
71 };
72 draw_tabs( w_missions, tabs, tab );
73 draw_border_below_tabs( w_missions );
74
75 mvwputch( w_missions, point( 30, 2 ), BORDER_COLOR,
76 tab == tab_mode::TAB_COMPLETED ? ' ' : LINE_OXXX ); // ^|^
77 mvwputch( w_missions, point( 30, FULL_SCREEN_HEIGHT - 1 ), BORDER_COLOR, LINE_XXOX ); // _|_
78
79 draw_scrollbar( w_missions, selection, entries_per_page, umissions.size(), point( 0, 3 ) );
80
81 for( int i = top_of_page; i <= bottom_of_page; i++ ) {
82 const auto miss = umissions[i];
83 const nc_color col = u.get_active_mission() == miss ? c_light_green : c_white;
84 const int y = i - top_of_page + 3;
85 trim_and_print( w_missions, point( 1, y ), 28,
86 static_cast<int>( selection ) == i ? hilite( col ) : col,
87 miss->name() );
88 }
89
90 if( selection < umissions.size() ) {
91 const auto miss = umissions[selection];
92 const nc_color col = u.get_active_mission() == miss ? c_light_green : c_white;
93 std::string for_npc;
94 if( miss->get_npc_id().is_valid() ) {
95 npc *guy = g->find_npc( miss->get_npc_id() );
96 if( guy ) {
97 for_npc = string_format( _( " for %s" ), guy->disp_name() );
98 }
99 }
100
101 int y = 3;
102 y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, col,
103 miss->name() + for_npc );
104
105 auto format_tokenized_description = []( const std::string & description,
106 const std::vector<std::pair<int, itype_id>> &rewards ) {
107 std::string formatted_description = description;
108 for( const auto &reward : rewards ) {
109 std::string token = "<reward_count:" + reward.second.str() + ">";
110 formatted_description = replace_all( formatted_description, token,
111 string_format( "%d", reward.first ) );
112 }
113 return formatted_description;
114 };
115
116 y++;
117 if( !miss->get_description().empty() ) {
118 y += fold_and_print( w_missions, point( 31, y ), getmaxx( w_missions ) - 33, c_white,
119 format_tokenized_description( miss->get_description(), miss->get_likely_rewards() ) );
120 }
121 if( miss->has_deadline() ) {
122 const time_point deadline = miss->get_deadline();
123 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Deadline: %s" ), to_string( deadline ) );
124
125 if( tab != tab_mode::TAB_COMPLETED ) {
126 // There's no point in displaying this for a completed mission.
127 // @ TODO: But displaying when you completed it would be useful.
128 const time_duration remaining = deadline - calendar::turn;
129 std::string remaining_time;
130
131 if( remaining <= 0_turns ) {
132 remaining_time = _( "None!" );
133 } else if( u.has_watch() ) {
134 remaining_time = to_string( remaining );
135 } else {
136 remaining_time = to_string_approx( remaining );
137 }
138
139 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Time remaining: %s" ), remaining_time );
140 }
141 }
142 if( miss->has_target() ) {
144 // TODO: target does not contain a z-component, targets are assumed to be on z=0
145 mvwprintz( w_missions, point( 31, ++y ), c_white, _( "Target: %s You: %s" ),
146 miss->get_target().to_string(), pos.to_string() );
147 }
148 } else {
149 static const std::map< tab_mode, std::string > nope = {
150 { tab_mode::TAB_ACTIVE, translate_marker( "You have no active missions!" ) },
151 { tab_mode::TAB_COMPLETED, translate_marker( "You haven't completed any missions!" ) },
152 { tab_mode::TAB_FAILED, translate_marker( "You haven't failed any missions!" ) }
153 };
154 mvwprintz( w_missions, point( 31, 4 ), c_light_red, _( nope.at( tab ) ) );
155 }
156
157 wnoutrefresh( w_missions );
158 } );
159
160 while( true ) {
161 umissions.clear();
162 if( tab < tab_mode::FIRST_TAB || tab >= tab_mode::NUM_TABS ) {
163 debugmsg( "The sanity check failed because tab=%d", static_cast<int>( tab ) );
164 tab = tab_mode::FIRST_TAB;
165 }
166 switch( tab ) {
168 umissions = u.get_active_missions();
169 break;
170 case tab_mode::TAB_COMPLETED:
171 umissions = u.get_completed_missions();
172 break;
173 case tab_mode::TAB_FAILED:
174 umissions = u.get_failed_missions();
175 break;
176 default:
177 break;
178 }
179 if( ( !umissions.empty() && selection >= umissions.size() ) ||
180 ( umissions.empty() && selection != 0 ) ) {
181 debugmsg( "Sanity check failed: selection=%d, size=%d", static_cast<int>( selection ),
182 static_cast<int>( umissions.size() ) );
183 selection = 0;
184 }
186 const std::string action = ctxt.handle_input();
187 if( action == "RIGHT" ) {
188 tab = static_cast<tab_mode>( static_cast<int>( tab ) + 1 );
189 if( tab >= tab_mode::NUM_TABS ) {
190 tab = tab_mode::FIRST_TAB;
191 }
192 selection = 0;
193 } else if( action == "LEFT" ) {
194 tab = static_cast<tab_mode>( static_cast<int>( tab ) - 1 );
195 if( tab < tab_mode::FIRST_TAB ) {
196 tab = tab_mode::LAST_TAB;
197 }
198 selection = 0;
199 } else if( action == "DOWN" ) {
200 selection++;
201 if( selection >= umissions.size() ) {
202 selection = 0;
203 }
204 } else if( action == "UP" ) {
205 if( selection == 0 ) {
206 selection = umissions.empty() ? 0 : umissions.size() - 1;
207 } else {
208 selection--;
209 }
210 } else if( action == "CONFIRM" ) {
211 if( tab == tab_mode::TAB_ACTIVE && selection < umissions.size() ) {
212 u.set_active_mission( *umissions[selection] );
213 }
214 break;
215 } else if( action == "QUIT" ) {
216 break;
217 }
218 }
219}
std::string to_string_approx(const time_duration &dur, const bool verbose)
Returns approximate duration.
Definition: calendar.cpp:361
bool has_watch() const
Returns true if the player or their vehicle has a watch.
Definition: character.cpp:717
void set_active_mission(mission &cur_mission)
Set which mission is active.
Definition: avatar.cpp:214
mission * get_active_mission() const
Returns the mission that is currently active.
Definition: avatar.cpp:193
std::vector< mission * > get_completed_missions() const
Definition: avatar.cpp:183
std::vector< mission * > get_active_missions() const
Definition: avatar.cpp:178
std::vector< mission * > get_failed_missions() const
Definition: avatar.cpp:188
A point in the game time.
Definition: calendar.h:431
nc_color hilite(const nc_color &c)
Definition: color.cpp:509
void draw_tabs(const catacurses::window &w, const std::vector< std::string > &tab_texts, size_t current_tab)
Definition: output.cpp:1274
void draw_border_below_tabs(const catacurses::window &w, nc_color border_color)
Definition: output.cpp:587
int fold_and_print(const catacurses::window &w, const point &begin, int width, const nc_color &base_color, const std::string &text, const char split)
Fold and print text in the given window.
Definition: output.cpp:299
#define LINE_XXOX
Definition: output.h:46
#define BORDER_COLOR
Definition: output.h:92
std::string replace_all(std::string input, const std::string &what, const std::string &with)
Replace all occurences of 'what' within 'input' with 'with'.
#define translate_marker(x)
Marks a string literal to be extracted for translation.
Definition: translations.h:30
catacurses::window new_centered_win(int nlines, int ncols)
Definition: ui.cpp:30

References _, action, BORDER_COLOR, c_light_green, c_light_red, c_white, debugmsg, Character::disp_name(), draw_border_below_tabs(), draw_scrollbar(), draw_tabs(), fold_and_print(), FULL_SCREEN_HEIGHT, FULL_SCREEN_WIDTH, g, avatar::get_active_mission(), avatar::get_active_missions(), avatar::get_completed_missions(), avatar::get_failed_missions(), catacurses::getmaxx(), Character::global_omt_location(), input_context::handle_input(), Character::has_watch(), hilite(), LINE_OXXX, LINE_XOXO, LINE_XXOX, mvwprintz(), mvwputch(), new_centered_win(), ui_manager::redraw(), input_context::register_action(), input_context::register_cardinal(), replace_all(), avatar::set_active_mission(), string_format(), anonymous_namespace{bionics_ui.cpp}::TAB_ACTIVE, coords::coord_point< Point, Origin, Scale >::to_string(), to_string(), to_string_approx(), translate_marker, trim_and_print(), calendar::turn, u, catacurses::werase(), and catacurses::wnoutrefresh().

Referenced by handle_action().

◆ list_monsters()

game::vmenu_ret game::list_monsters ( const std::vector< Creature * > &  monster_list)
private

Definition at line 7686 of file game.cpp.

7687{
7688 const int iInfoHeight = 15;
7689 const int width = 45;
7690 int offsetX = 0;
7691 int iMaxRows = 0;
7692
7693 catacurses::window w_monsters;
7694 catacurses::window w_monsters_border;
7695 catacurses::window w_monster_info;
7696 catacurses::window w_monster_info_border;
7697
7698 Creature *cCurMon = nullptr;
7699 tripoint iActivePos;
7700
7701 bool hide_ui = false;
7702
7703 ui_adaptor ui;
7704 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
7705 if( hide_ui ) {
7706 ui.position( point_zero, point_zero );
7707 } else {
7708 offsetX = TERMX - width;
7709 iMaxRows = TERMY - iInfoHeight - 1;
7710
7711 w_monsters = catacurses::newwin( iMaxRows, width - 2, point( offsetX + 1,
7712 1 ) );
7713 w_monsters_border = catacurses::newwin( iMaxRows + 1, width, point( offsetX,
7714 0 ) );
7715 w_monster_info = catacurses::newwin( iInfoHeight - 2, width - 2,
7716 point( offsetX + 1, TERMY - iInfoHeight + 1 ) );
7717 w_monster_info_border = catacurses::newwin( iInfoHeight, width, point( offsetX,
7718 TERMY - iInfoHeight ) );
7719
7720 if( cCurMon ) {
7721 centerlistview( iActivePos, width );
7722 }
7723
7724 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
7725 }
7726 } );
7727 ui.mark_resize();
7728
7729 const int max_gun_range = u.weapon.gun_range( &u );
7730
7731 const tripoint stored_view_offset = u.view_offset;
7733
7734 int iActive = 0; // monster index that we're looking at
7735
7736 std::string action;
7737 input_context ctxt( "LIST_MONSTERS" );
7738 ctxt.register_action( "UP", to_translation( "Move cursor up" ) );
7739 ctxt.register_action( "DOWN", to_translation( "Move cursor down" ) );
7740 ctxt.register_action( "NEXT_TAB" );
7741 ctxt.register_action( "PREV_TAB" );
7742 ctxt.register_action( "SAFEMODE_BLACKLIST_ADD" );
7743 ctxt.register_action( "SAFEMODE_BLACKLIST_REMOVE" );
7744 ctxt.register_action( "QUIT" );
7745 if( bVMonsterLookFire ) {
7746 ctxt.register_action( "look" );
7747 ctxt.register_action( "fire" );
7748 }
7749 ctxt.register_action( "HELP_KEYBINDINGS" );
7750
7751 // first integer is the row the attitude category string is printed in the menu
7752 std::map<int, Creature::Attitude> mSortCategory;
7753
7754 for( int i = 0, last_attitude = -1; i < static_cast<int>( monster_list.size() ); i++ ) {
7755 const auto attitude = monster_list[i]->attitude_to( u );
7756 if( attitude != last_attitude ) {
7757 mSortCategory[i + mSortCategory.size()] = attitude;
7758 last_attitude = attitude;
7759 }
7760 }
7761
7762 ui.on_redraw( [&]( const ui_adaptor & ) {
7763 if( !hide_ui ) {
7764 draw_custom_border( w_monsters_border, true, true, true, true, true, true, LINE_XOXO, LINE_XOXO );
7765 draw_custom_border( w_monster_info_border, true, true, true, true, LINE_XXXO, LINE_XOXX, true,
7766 true );
7767
7768 mvwprintz( w_monsters_border, point( 2, 0 ), c_light_green, "<Tab> " );
7769 wprintz( w_monsters_border, c_white, _( "Monsters" ) );
7770
7771 if( monster_list.empty() ) {
7772 werase( w_monsters );
7773 mvwprintz( w_monsters, point( 2, iMaxRows / 3 ), c_white,
7774 _( "You don't see any monsters around you!" ) );
7775 } else {
7776 werase( w_monsters );
7777
7778 const int iNumMonster = monster_list.size();
7779 const int iMenuSize = monster_list.size() + mSortCategory.size();
7780
7781 const int numw = iNumMonster > 999 ? 4 :
7782 iNumMonster > 99 ? 3 :
7783 iNumMonster > 9 ? 2 : 1;
7784
7785 // given the currently selected monster iActive. get the selected row
7786 int iSelPos = iActive;
7787 for( auto &ia : mSortCategory ) {
7788 int index = ia.first;
7789 if( index <= iSelPos ) {
7790 ++iSelPos;
7791 } else {
7792 break;
7793 }
7794 }
7795 int iStartPos = 0;
7796 // use selected row get the start row
7797 calcStartPos( iStartPos, iSelPos, iMaxRows - 1, iMenuSize );
7798
7799 // get first visible monster and category
7800 int iCurMon = iStartPos;
7801 auto CatSortIter = mSortCategory.cbegin();
7802 while( CatSortIter != mSortCategory.cend() && CatSortIter->first < iStartPos ) {
7803 ++CatSortIter;
7804 --iCurMon;
7805 }
7806
7807 const auto endY = std::min<int>( iMaxRows - 1, iMenuSize );
7808 for( int y = 0; y < endY; ++y ) {
7809 if( CatSortIter != mSortCategory.cend() ) {
7810 const int iCurPos = iStartPos + y;
7811 const int iCatPos = CatSortIter->first;
7812 if( iCurPos == iCatPos ) {
7813 const std::string cat_name = Creature::get_attitude_ui_data(
7814 CatSortIter->second ).first.translated();
7815 mvwprintz( w_monsters, point( 1, y ), c_magenta, cat_name );
7816 ++CatSortIter;
7817 continue;
7818 }
7819 }
7820 // select current monster
7821 const auto critter = monster_list[iCurMon];
7822 const bool selected = iCurMon == iActive;
7823 ++iCurMon;
7824 if( critter->sees( g->u ) ) {
7825 mvwprintz( w_monsters, point( 0, y ), c_yellow, "!" );
7826 }
7827 bool is_npc = false;
7828 const monster *m = dynamic_cast<monster *>( critter );
7829 const npc *p = dynamic_cast<npc *>( critter );
7830 nc_color name_color = critter->basic_symbol_color();
7831
7832 if( selected ) {
7833 name_color = hilite( name_color );
7834 }
7835
7836 if( m != nullptr ) {
7837 trim_and_print( w_monsters, point( 1, y ), width - 26, name_color, m->name() );
7838 } else {
7839 trim_and_print( w_monsters, point( 1, y ), width - 26, name_color, critter->disp_name() );
7840 is_npc = true;
7841 }
7842
7843 if( selected && !get_safemode().empty() ) {
7844 const std::string monName = is_npc ? get_safemode().npc_type_name() : m->name();
7845
7846 std::string sSafemode;
7847 if( get_safemode().has_rule( monName, Creature::A_ANY ) ) {
7848 sSafemode = _( "<R>emove from safemode Blacklist" );
7849 } else {
7850 sSafemode = _( "<A>dd to safemode Blacklist" );
7851 }
7852
7853 shortcut_print( w_monsters, point( 2, getmaxy( w_monsters ) - 1 ),
7854 c_white, c_light_green, sSafemode );
7855 }
7856
7858 std::string sText;
7859
7860 if( m != nullptr ) {
7861 m->get_HP_Bar( color, sText );
7862 } else {
7863 std::tie( sText, color ) =
7864 ::get_hp_bar( critter->get_hp(), critter->get_hp_max(), false );
7865 }
7866 mvwprintz( w_monsters, point( width - 25, y ), color, sText );
7867
7868 if( m != nullptr ) {
7869 const auto att = m->get_attitude();
7870 sText = att.first;
7871 color = att.second;
7872 } else if( p != nullptr ) {
7873 sText = npc_attitude_name( p->get_attitude() );
7874 color = p->symbol_color();
7875 }
7876 mvwprintz( w_monsters, point( width - 19, y ), color, sText );
7877
7878 const int mon_dist = rl_dist( u.pos(), critter->pos() );
7879 const int numd = mon_dist > 999 ? 4 :
7880 mon_dist > 99 ? 3 :
7881 mon_dist > 9 ? 2 : 1;
7882
7883 trim_and_print( w_monsters, point( width - ( 8 + numd ), y ), 6 + numd,
7884 selected ? c_light_green : c_light_gray,
7885 "%*d %s",
7886 numd, mon_dist,
7887 direction_name_short( direction_from( u.pos(), critter->pos() ) ) );
7888 }
7889
7890 mvwprintz( w_monsters_border, point( ( width / 2 ) - numw - 2, 0 ), c_light_green, " %*d", numw,
7891 iActive + 1 );
7892 wprintz( w_monsters_border, c_white, " / %*d ", numw, static_cast<int>( monster_list.size() ) );
7893
7894 werase( w_monster_info );
7895 if( cCurMon ) {
7896 cCurMon->print_info( w_monster_info, 1, iInfoHeight - 3, 1 );
7897 }
7898
7899 draw_custom_border( w_monster_info_border, true, true, true, true, LINE_XXXO, LINE_XOXX, true,
7900 true );
7901
7902 if( bVMonsterLookFire ) {
7903 mvwprintw( w_monster_info_border, point_east, "< " );
7904 wprintz( w_monster_info_border, c_light_green, ctxt.press_x( "look" ) );
7905 wprintz( w_monster_info_border, c_light_gray, " %s", _( "to look around" ) );
7906
7907 if( cCurMon && rl_dist( u.pos(), cCurMon->pos() ) <= max_gun_range ) {
7908 wprintw( w_monster_info_border, " " );
7909 wprintz( w_monster_info_border, c_light_green, ctxt.press_x( "fire" ) );
7910 wprintz( w_monster_info_border, c_light_gray, " %s", _( "to shoot" ) );
7911 }
7912 wprintw( w_monster_info_border, " >" );
7913 }
7914
7915 draw_scrollbar( w_monsters_border, iActive, iMaxRows, static_cast<int>( monster_list.size() ),
7916 point_south );
7917 }
7918
7919 wnoutrefresh( w_monsters_border );
7920 wnoutrefresh( w_monster_info_border );
7921 wnoutrefresh( w_monsters );
7922 wnoutrefresh( w_monster_info );
7923 }
7924 } );
7925
7926 cata::optional<tripoint> trail_start;
7927 cata::optional<tripoint> trail_end;
7928 bool trail_end_x = false;
7929 shared_ptr_fast<draw_callback_t> trail_cb = create_trail_callback( trail_start, trail_end,
7930 trail_end_x );
7931 add_draw_callback( trail_cb );
7932
7933 do {
7934 if( action == "UP" ) {
7935 iActive--;
7936 if( iActive < 0 ) {
7937 if( monster_list.empty() ) {
7938 iActive = 0;
7939 } else {
7940 iActive = static_cast<int>( monster_list.size() ) - 1;
7941 }
7942 }
7943 } else if( action == "DOWN" ) {
7944 iActive++;
7945 if( iActive >= static_cast<int>( monster_list.size() ) ) {
7946 iActive = 0;
7947 }
7948 } else if( action == "NEXT_TAB" || action == "PREV_TAB" ) {
7949 u.view_offset = stored_view_offset;
7951 } else if( action == "SAFEMODE_BLACKLIST_REMOVE" ) {
7952 const auto m = dynamic_cast<monster *>( cCurMon );
7953 const std::string monName = ( m != nullptr ) ? m->name() : "human";
7954
7955 if( get_safemode().has_rule( monName, Creature::A_ANY ) ) {
7957 }
7958 } else if( action == "SAFEMODE_BLACKLIST_ADD" ) {
7959 if( !get_safemode().empty() ) {
7960 const auto m = dynamic_cast<monster *>( cCurMon );
7961 const std::string monName = ( m != nullptr ) ? m->name() : "human";
7962
7963 get_safemode().add_rule( monName, Creature::A_ANY, get_option<int>( "SAFEMODEPROXIMITY" ),
7965 }
7966 } else if( action == "look" ) {
7967 hide_ui = true;
7968 ui.mark_resize();
7969 look_around();
7970 hide_ui = false;
7971 ui.mark_resize();
7972 } else if( action == "fire" ) {
7973 if( cCurMon != nullptr && rl_dist( u.pos(), cCurMon->pos() ) <= max_gun_range ) {
7974 u.last_target = shared_from( *cCurMon );
7976 u.view_offset = stored_view_offset;
7977 return game::vmenu_ret::FIRE;
7978 }
7979 }
7980
7981 if( iActive >= 0 && static_cast<size_t>( iActive ) < monster_list.size() ) {
7982 cCurMon = monster_list[iActive];
7983 iActivePos = cCurMon->pos() - u.pos();
7984 centerlistview( iActivePos, width );
7985 trail_start = u.pos();
7986 trail_end = cCurMon->pos();
7987 // Actually accessed from the terrain overlay callback `trail_cb` in the
7988 // call to `ui_manager::redraw`.
7989 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
7990 trail_end_x = false;
7991 } else {
7992 cCurMon = nullptr;
7993 iActivePos = tripoint_zero;
7994 u.view_offset = stored_view_offset;
7995 trail_start = trail_end = cata::nullopt;
7996 }
7998
8000
8001 action = ctxt.handle_input();
8002 } while( action != "QUIT" );
8003
8004 u.view_offset = stored_view_offset;
8005
8006 return game::vmenu_ret::QUIT;
8007}
double recoil
Definition: character.h:563
nc_color symbol_color() const override
Definition: character.cpp:6004
static const std::pair< translation, nc_color > & get_attitude_ui_data(Attitude att)
Creature Attitude as String and color.
Definition: creature.cpp:1866
virtual const tripoint & pos() const =0
virtual int print_info(const catacurses::window &w, int vStart, int vLines, int column) const =0
Write information about this creature.
shared_ptr_fast< T > shared_from(const T &critter)
Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature).
Definition: game.cpp:4546
bool bVMonsterLookFire
Definition: game.h:1035
int gun_range(const player *p) const
The weapons range in map squares.
Definition: item.cpp:7362
npc_attitude get_attitude() const
Definition: npc.cpp:3164
weak_ptr_fast< Creature > last_target
Definition: player.h:241
bool has_rule(const std::string &rule_in, Creature::Attitude attitude_in)
void remove_rule(const std::string &rule_in, Creature::Attitude attitude_in)
static nc_color color(const T_t &t)
@ RULE_BLACKLISTED
Definition: enums.h:54
constexpr double MAX_RECOIL
std::string npc_attitude_name(npc_attitude att)
Definition: npc.cpp:2565
std::pair< std::string, nc_color > get_hp_bar(const int cur_hp, const int max_hp, const bool is_mon)
Definition: output.cpp:1604
size_t shortcut_print(const catacurses::window &w, const point &p, nc_color text_color, nc_color shortcut_color, const std::string &fmt)
Definition: output.cpp:1543

References _, Creature::A_ANY, action, add_draw_callback(), safemode::add_rule(), bVMonsterLookFire, c_light_gray, c_light_green, c_magenta, c_white, c_yellow, calcStartPos(), centerlistview(), CHANGE_TAB, color(), create_trail_callback(), direction_from(), direction_name_short(), draw_custom_border(), draw_scrollbar(), FIRE, g, npc::get_attitude(), Creature::get_attitude_ui_data(), get_hp_bar(), get_safemode(), catacurses::getmaxy(), item::gun_range(), input_context::handle_input(), safemode::has_rule(), hilite(), invalidate_main_ui_adaptor(), player::last_target, LINE_XOXO, LINE_XOXX, LINE_XXXO, look_around(), m, MAX_RECOIL, catacurses::mvwprintw(), mvwprintz(), map::name(), catacurses::newwin(), npc_attitude_name(), safemode::npc_type_name(), cata::nullopt, point_east, point_south, point_zero, Creature::pos(), Character::pos(), input_context::press_x(), Creature::print_info(), QUIT, Character::recoil, ui_manager::redraw(), input_context::register_action(), safemode::remove_rule(), rl_dist(), RULE_BLACKLISTED, shared_from(), shortcut_print(), Character::symbol_color(), TERMX, TERMY, to_translation(), trim_and_print(), tripoint_zero, u, player::view_offset, Character::weapon, catacurses::werase(), catacurses::wnoutrefresh(), catacurses::wprintw(), and wprintz().

Referenced by list_items_monsters().

◆ load() [1/2]

bool game::load ( const save_t name)
private

Definition at line 2532 of file game.cpp.

2533{
2536 popup.message( "%s", _( "Please wait…\nLoading the save…" ) );
2539
2540 using namespace std::placeholders;
2541
2542 const std::string worldpath = get_world_base_save_path() + "/";
2543 const std::string playerpath = worldpath + name.base_path();
2544
2545 // Now load up the master game data; factions (and more?)
2546 load_master();
2547 u = avatar();
2548 u.name = name.player_name();
2549 // This should be initialized more globally (in player/Character constructor)
2551 if( !read_from_file( playerpath + SAVE_EXTENSION, std::bind( &game::unserialize, this, _1 ) ) ) {
2552 return false;
2553 }
2554
2556 u.get_avatar_diary()->load();
2557
2559
2560 read_from_file_optional( worldpath + name.base_path() + SAVE_EXTENSION_LOG,
2561 std::bind( &memorial_logger::load, &memorial(), _1 ) );
2562
2563#if defined(__ANDROID__)
2564 read_from_file_optional( worldpath + name.base_path() + SAVE_EXTENSION_SHORTCUTS,
2565 std::bind( &game::load_shortcuts, this, _1 ) );
2566#endif
2567
2568 // Now that the player's worn items are updated, their sight limits need to be
2569 // recalculated. (This would be cleaner if u.worn were private.)
2571
2572 if( !gamemode ) {
2573 gamemode = std::make_unique<special_game>();
2574 }
2575
2576 safe_mode = get_option<bool>( "SAFEMODE" ) ? SAFE_MODE_ON : SAFE_MODE_OFF;
2577 mostseen = 0; // ...and mostseen is 0, we haven't seen any monsters yet.
2578
2579 init_autosave();
2580 get_auto_pickup().load_character(); // Load character auto pickup rules
2581 get_auto_notes_settings().load(); // Load character auto notes settings
2582 get_safemode().load_character(); // Load character safemode rules
2583 zone_manager::get_manager().load_zones(); // Load character world zones
2584 read_from_file_optional( get_world_base_save_path() + "/uistate.json", []( std::istream & stream ) {
2585 JsonIn jsin( stream );
2586 uistate.deserialize( jsin );
2587 } );
2588 reload_npcs();
2593 update_map( u );
2594 for( auto &e : u.inv_dump() ) {
2595 e->set_owner( g->u );
2596 }
2597 // legacy, needs to be here as we access the map.
2598 if( !u.getID().is_valid() ) {
2599 // player does not have a real id, so assign a new one,
2600 u.setID( assign_npc_id() );
2601 // The vehicle stores the IDs of the boarded players, so update it, too.
2602 if( u.in_vehicle ) {
2604 u.pos() ).part_with_feature( "BOARDABLE", true ) ) {
2605 vp->part().passenger_id = u.getID();
2606 }
2607 }
2608 }
2609
2610 // populate calendar caches now, after active world is set, but before we do
2611 // anything else, to ensure they pick up the correct value from the save's
2612 // worldoptions
2613 calendar::set_eternal_season( ::get_option<bool>( "ETERNAL_SEASON" ) );
2614 calendar::set_season_length( ::get_option<int>( "SEASON_LENGTH" ) );
2615
2616 u.reset();
2617
2618 return true;
2619}
bool read_from_file(const std::string &path, const std::function< void(std::istream &)> &reader)
Try to open and read from given file using the given callback.
bool read_from_file_optional(const std::string &path, const std::function< void(std::istream &)> &reader)
void setID(character_id i, bool force=false)
Definition: character.cpp:472
std::vector< item * > inv_dump()
Definition: character.cpp:8915
void recalc_sight_limits()
Modifies the player's sight values Must be called when any of the following change: This must be call...
Definition: character.cpp:1610
void reset() override
Handles stat and bonus reset.
Definition: character.cpp:3610
Definition: json.h:173
Definition: avatar.h:55
void load_map_memory()
Definition: avatar.cpp:137
Helper class that fills the background and obscures all UIs below.
Definition: ui_manager.h:193
bool is_valid() const
Definition: character_id.h:19
void load()
Definition: diary.cpp:810
void validate_linked_vehicles()
validate towed vehicles so they get linked up again after a load
Definition: game.cpp:1894
void reload_npcs()
Unloads, then loads the NPCs.
Definition: game.cpp:868
void validate_camps()
validate camps to ensure they are on the overmap list
Definition: game.cpp:1952
void load_master()
Definition: game.cpp:2501
void validate_mounted_npcs()
Definition: game.cpp:1909
character_id assign_npc_id()
Definition: game.cpp:3554
void unserialize(std::istream &fin)
Definition: savegame.cpp:167
void init_autosave()
Definition: game.cpp:11224
void validate_npc_followers()
validate list of followers to account for overmap buffers
Definition: game.cpp:1928
void load(std::istream &fin)
Loads the data in a memorial file from the given ifstream.
void load_character()
Create a popup on the UI stack that gets displayed but receives no input itself.
Definition: popup.h:278
void deserialize(const JsonObject &jo)
time_point nextweather
Definition: weather.h:205
void load_zones()
Definition: clzones.cpp:1216
static const std::string SAVE_EXTENSION(".sav")
static const std::string SAVE_EXTENSION_SHORTCUTS(".shortcuts")
static const std::string SAVE_EXTENSION_LOG(".log")
void set_season_length(int dur)
Definition: calendar.cpp:478
void set_eternal_season(bool is_eternal_season)
Definition: calendar.cpp:470

References _, assign_npc_id(), uistatedata::deserialize(), g, gamemode, get_auto_notes_settings(), get_auto_pickup(), avatar::get_avatar_diary(), zone_manager::get_manager(), get_safemode(), get_weather, get_world_base_save_path(), Character::getID(), Character::in_vehicle, init_autosave(), Character::inv_dump(), character_id::is_valid(), auto_notes::auto_note_settings::load(), diary::load(), memorial_logger::load(), auto_pickup::player_settings::load_character(), safemode::load_character(), avatar::load_map_memory(), load_master(), zone_manager::load_zones(), m, memorial(), mostseen, Character::name, om_direction::name(), weather_manager::nextweather, optional_vpart_position::part_with_feature(), popup(), Character::pos(), read_from_file(), read_from_file_optional(), Character::recalc_sight_limits(), ui_manager::redraw(), refresh_display(), reload_npcs(), Character::reset(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAVE_EXTENSION(), SAVE_EXTENSION_LOG(), SAVE_EXTENSION_SHORTCUTS(), calendar::set_eternal_season(), calendar::set_season_length(), Character::setID(), calendar::start_of_cataclysm, calendar::turn, u, uistate, unserialize(), update_map(), validate_camps(), validate_linked_vehicles(), validate_mounted_npcs(), validate_npc_followers(), map::veh_at(), and Character::weapon.

◆ load() [2/2]

bool game::load ( const std::string &  world)

Attempt to load first valid save (if any) in world.

Definition at line 2508 of file game.cpp.

2509{
2510 world_generator->init();
2511 const WORLDPTR wptr = world_generator->get_world( world );
2512 if( !wptr ) {
2513 return false;
2514 }
2515 if( wptr->world_saves.empty() ) {
2516 debugmsg( "world '%s' contains no saves", world );
2517 return false;
2518 }
2519
2520 try {
2521 world_generator->set_active_world( wptr );
2522 g->setup();
2523 g->load( wptr->world_saves.front() );
2524 } catch( const std::exception &err ) {
2525 debugmsg( "cannot load world '%s': %s", world, err.what() );
2526 return false;
2527 }
2528
2529 return true;
2530}
std::vector< save_t > world_saves
Definition: worldfactory.h:61

References debugmsg, g, world_generator, and WORLD::world_saves.

Referenced by quickload().

◆ load_map() [1/2]

void game::load_map ( const tripoint pos_sm,
bool  pump_events = false 
)

Load the main map at given location, see map::load, in global, absolute submap coordinates.

Parameters
pump_eventsIf true, handle window events during loading. If you set this to true, do ensure that the map is not accessed before this function returns (for example, UIs that draw the map should be disabled).

Definition at line 540 of file game.cpp.

541{
542 // TODO: fix point types
543 load_map( tripoint_abs_sm( pos_sm ), pump_events );
544}
void load_map(const tripoint &pos_sm, bool pump_events=false)
Load the main map at given location, see map::load, in global, absolute submap coordinates.
Definition: game.cpp:540
coords::coord_point< tripoint, coords::origin::abs, coords::sm > tripoint_abs_sm
Definition: coordinates.h:490

References load_map().

Referenced by load_map(), place_player_overmap(), start_game(), and unserialize().

◆ load_map() [2/2]

void game::load_map ( const tripoint_abs_sm pos_sm,
bool  pump_events = false 
)

Definition at line 546 of file game.cpp.

548{
549 m.load( pos_sm, true, pump_events );
550 grid_tracker_ptr->load( m );
551}
void load(const tripoint &w, bool update_vehicles, bool pump_events=false)
Load submaps into grid.
Definition: map.cpp:6683

References grid_tracker_ptr, map::load(), and m.

◆ load_master()

void game::load_master ( )
private

Definition at line 2501 of file game.cpp.

2502{
2503 using namespace std::placeholders;
2504 const auto datafile = get_world_base_save_path() + "/" + SAVE_MASTER;
2505 read_from_file_optional( datafile, std::bind( &game::unserialize_master, this, _1 ) );
2506}
void unserialize_master(std::istream &fin)
Definition: savegame.cpp:1193
static const std::string SAVE_MASTER("master.gsav")

References get_world_base_save_path(), read_from_file_optional(), SAVE_MASTER(), and unserialize_master().

Referenced by load(), and start_game().

◆ load_npcs()

void game::load_npcs ( )

Makes any nearby NPCs on the overmap active.

Definition at line 806 of file game.cpp.

807{
808 const int radius = HALF_MAPSIZE - 1;
809 // uses submap coordinates
810 std::vector<shared_ptr_fast<npc>> just_added;
811 for( const auto &temp : overmap_buffer.get_npcs_near_player( radius ) ) {
812 const character_id &id = temp->getID();
813 const auto found = std::find_if( active_npc.begin(), active_npc.end(),
814 [id]( const shared_ptr_fast<npc> &n ) {
815 return n->getID() == id;
816 } );
817 if( found != active_npc.end() ) {
818 continue;
819 }
820 if( temp->is_active() ) {
821 continue;
822 }
823 if( temp->has_companion_mission() ) {
824 continue;
825 }
826
827 const tripoint sm_loc = temp->global_sm_location();
828 // NPCs who are out of bounds before placement would be pushed into bounds
829 // This can cause NPCs to teleport around, so we don't want that
830 if( sm_loc.x < get_levx() || sm_loc.x >= get_levx() + MAPSIZE ||
831 sm_loc.y < get_levy() || sm_loc.y >= get_levy() + MAPSIZE ||
832 ( sm_loc.z != get_levz() && !m.has_zlevels() ) ) {
833 continue;
834 }
835
836 add_msg( m_debug, "game::load_npcs: Spawning static NPC, %d:%d:%d (%d:%d:%d)",
837 get_levx(), get_levy(), get_levz(), sm_loc.x, sm_loc.y, sm_loc.z );
838 temp->place_on_map();
839 if( !m.inbounds( temp->pos() ) ) {
840 continue;
841 }
842 // In the rare case the npc was marked for death while
843 // it was on the overmap. Kill it.
844 if( temp->marked_for_death ) {
845 temp->die( nullptr );
846 } else {
847 active_npc.push_back( temp );
848 just_added.push_back( temp );
849 }
850 }
851
852 for( const auto &npc : just_added ) {
853 npc->on_load();
854 }
855
856 npcs_dirty = false;
857}
void on_load()
Retroactively update npc.
Definition: npc.cpp:2678
static constexpr int MAPSIZE

References active_npc, add_msg(), get_levx(), get_levy(), get_levz(), overmapbuffer::get_npcs_near_player(), HALF_MAPSIZE, map::has_zlevels(), map::inbounds(), m, m_debug, MAPSIZE, npcs_dirty, npc::on_load(), overmap_buffer, tripoint::x, tripoint::y, and tripoint::z.

Referenced by do_turn(), perhaps_add_random_npc(), place_player_overmap(), reload_npcs(), save_cyborg(), spawn_hallucination(), start_game(), and update_map().

◆ load_static_data()

void game::load_static_data ( )

Loads static data that does not depend on mods or similar.

Definition at line 336 of file game.cpp.

337{
338 // UI stuff, not mod-specific per definition
339 inp_mngr.init(); // Load input config JSON
340 // Init mappings for loading the json stuff
342 fullscreen = false;
343 was_fullscreen = false;
344 show_panel_adm = false;
346
347 // These functions do not load stuff from json.
348 // The content they load/initialize is hardcoded into the program.
349 // Therefore they can be loaded here.
350 // If this changes (if they load data from json), they have to
351 // be moved to game::load_mod
352
356}
static DynamicDataLoader & get_instance()
Returns the single instance of this class.
Definition: init.cpp:119
bool was_fullscreen
Definition: game.h:1017
bool fullscreen
Definition: game.h:1016
void init()
Initializes the input manager, aka loads the input mapping configuration JSON.
Definition: input.cpp:111
void init()
Definition: panels.cpp:2191
void load_global()

References fullscreen, get_auto_pickup(), get_distraction_manager(), DynamicDataLoader::get_instance(), panel_manager::get_manager(), get_safemode(), input_manager::init(), panel_manager::init(), inp_mngr, distraction_manager::distraction_manager_gui::load(), auto_pickup::player_settings::load_global(), safemode::load_global(), show_panel_adm, and was_fullscreen.

◆ look_around() [1/2]

cata::optional< tripoint > game::look_around ( bool  force_3d = false)

Definition at line 6538 of file game.cpp.

6539{
6541 look_around_result result = look_around( /*show_window=*/true, center, center, false, false,
6542 false, false, tripoint_zero, force_3d );
6543 return result.position;
6544}

References center, look_around(), Character::pos(), tripoint_zero, u, and player::view_offset.

Referenced by handle_action(), list_monsters(), look_around(), peek(), and zones_manager().

◆ look_around() [2/2]

look_around_result game::look_around ( bool  show_window,
tripoint center,
const tripoint start_point,
bool  has_first_point,
bool  select_zone,
bool  peeking,
bool  is_moving_zone = false,
const tripoint end_point = tripoint_zero,
bool  force_3d = false 
)
Parameters
show_windowdisplay the info window that holds the tile information in the position.
centerused to calculate the u.view_offset, could center the screen to the position it represents
start_pointthe start point of the targeting zone, also the initial local position of the cursor
has_first_pointshould be true if the first point has been selected when editing the zone
select_zonetrue if the zone is being edited
peekingdetermines if the player is peeking
is_moving_zonetrue if the zone is being moved, false by default
end_pointthe end point of the targeting zone, only used if is_moving_zone is true, default is tripoint_zero
Returns
look_around_result

Definition at line 6546 of file game.cpp.

6549{
6550 bVMonsterLookFire = false;
6551 // TODO: Make this `true`
6552 const bool allow_zlev_move = m.has_zlevels() && ( get_option<bool>( "FOV_3D" ) || force_3d );
6553
6555
6556 tripoint lp = is_moving_zone ? ( start_point + end_point ) / 2 : start_point; // cursor
6557 int &lx = lp.x;
6558 int &ly = lp.y;
6559 int &lz = lp.z;
6560
6561 int soffset = get_option<int>( "FAST_SCROLL_OFFSET" );
6562 bool fast_scroll = false;
6563
6564 std::unique_ptr<ui_adaptor> ui;
6565 catacurses::window w_info;
6566 if( show_window ) {
6567 ui = std::make_unique<ui_adaptor>();
6568 ui->on_screen_resize( [&]( ui_adaptor & ui ) {
6569 int panel_width = panel_manager::get_manager().get_current_layout().begin()->get_width();
6571
6572 // If particularly small, base height on panel width irrespective of other elements.
6573 // Value here is attempting to get a square-ish result assuming 1x2 proportioned font.
6574 if( height < panel_width / 2 ) {
6575 height = panel_width / 2;
6576 }
6577
6578 int la_y = 0;
6579 int la_x = TERMX - panel_width;
6580 std::string position = get_option<std::string>( "LOOKAROUND_POSITION" );
6581 if( position == "left" ) {
6582 if( get_option<std::string>( "SIDEBAR_POSITION" ) == "right" ) {
6584 } else {
6585 la_x = panel_manager::get_manager().get_width_left() - panel_width;
6586 }
6587 }
6588 int la_h = height;
6589 int la_w = panel_width;
6590 w_info = catacurses::newwin( la_h, la_w, point( la_x, la_y ) );
6591
6592 ui.position_from_window( w_info );
6593 } );
6594 ui->mark_resize();
6595 }
6596
6597 std::string action;
6598 input_context ctxt( "LOOK" );
6599 ctxt.set_iso( true );
6600 ctxt.register_directions();
6601 ctxt.register_action( "COORDINATE" );
6602 ctxt.register_action( "LEVEL_UP" );
6603 ctxt.register_action( "LEVEL_DOWN" );
6604 ctxt.register_action( "TOGGLE_FAST_SCROLL" );
6605 ctxt.register_action( "EXTENDED_DESCRIPTION" );
6606 ctxt.register_action( "SELECT" );
6607 if( peeking ) {
6608 ctxt.register_action( "throw_blind" );
6609 }
6610 if( !select_zone ) {
6611 ctxt.register_action( "TRAVEL_TO" );
6612 ctxt.register_action( "LIST_ITEMS" );
6613 }
6614 ctxt.register_action( "MOUSE_MOVE" );
6615 ctxt.register_action( "CENTER" );
6616
6617 ctxt.register_action( "debug_scent" );
6618 ctxt.register_action( "debug_scent_type" );
6619 ctxt.register_action( "debug_temp" );
6620 ctxt.register_action( "debug_visibility" );
6621 ctxt.register_action( "debug_lighting" );
6622 ctxt.register_action( "debug_radiation" );
6623 ctxt.register_action( "debug_submap_grid" );
6624 ctxt.register_action( "debug_hour_timer" );
6625 ctxt.register_action( "CONFIRM" );
6626 ctxt.register_action( "QUIT" );
6627 ctxt.register_action( "HELP_KEYBINDINGS" );
6628 if( use_tiles ) {
6629 ctxt.register_action( "zoom_out" );
6630 ctxt.register_action( "zoom_in" );
6631 }
6632#if defined(TILES)
6633 ctxt.register_action( "toggle_pixel_minimap" );
6634#endif // TILES
6635
6636 const int old_levz = get_levz();
6637 const int min_levz = force_3d ? -OVERMAP_DEPTH : std::max( old_levz - fov_3d_z_range,
6638 -OVERMAP_DEPTH );
6639 const int max_levz = force_3d ? OVERMAP_HEIGHT : std::min( old_levz + fov_3d_z_range,
6641
6642 m.update_visibility_cache( old_levz );
6644
6645 bool blink = true;
6647
6648 shared_ptr_fast<draw_callback_t> ter_indicator_cb;
6649
6650 if( show_window && ui ) {
6651 ui->on_redraw( [&]( const ui_adaptor & ) {
6652 werase( w_info );
6653 draw_border( w_info );
6654
6655 center_print( w_info, 0, c_white, string_format( _( "< <color_green>Look Around</color> >" ) ) );
6656
6657 std::string extended_descr_text = string_format( _( "%s - %s" ),
6658 ctxt.get_desc( "EXTENDED_DESCRIPTION" ),
6659 ctxt.get_action_name( "EXTENDED_DESCRIPTION" ) );
6660 std::string fast_scroll_text = string_format( _( "%s - %s" ),
6661 ctxt.get_desc( "TOGGLE_FAST_SCROLL" ),
6662 ctxt.get_action_name( "TOGGLE_FAST_SCROLL" ) );
6663#if defined(TILES)
6664 std::string pixel_minimap_text = string_format( _( "%s - %s" ),
6665 ctxt.get_desc( "toggle_pixel_minimap" ),
6666 ctxt.get_action_name( "toggle_pixel_minimap" ) );
6667#endif // TILES
6668
6669 center_print( w_info, getmaxy( w_info ) - 2, c_light_gray, extended_descr_text );
6670 mvwprintz( w_info, point( 1, getmaxy( w_info ) - 1 ), fast_scroll ? c_light_green : c_green,
6671 fast_scroll_text );
6672#if defined(TILES)
6673 right_print( w_info, getmaxy( w_info ) - 1, 1, pixel_minimap_option ? c_light_green : c_green,
6674 pixel_minimap_text );
6675#endif // TILES
6676
6677 int first_line = 1;
6678 const int last_line = getmaxy( w_info ) - 3;
6679 pre_print_all_tile_info( lp, w_info, first_line, last_line, cache );
6680
6681 wnoutrefresh( w_info );
6682 } );
6683 ter_indicator_cb = make_shared_fast<draw_callback_t>( [&]() {
6684 draw_look_around_cursor( lp, cache );
6685 } );
6686 add_draw_callback( ter_indicator_cb );
6687 }
6688
6689 cata::optional<tripoint> zone_start;
6690 cata::optional<tripoint> zone_end;
6691 bool zone_blink = false;
6692 bool zone_cursor = true;
6693 shared_ptr_fast<draw_callback_t> zone_cb = create_zone_callback( zone_start, zone_end, zone_blink,
6694 zone_cursor, is_moving_zone );
6695 add_draw_callback( zone_cb );
6696
6697 is_looking = true;
6698 const tripoint prev_offset = u.view_offset;
6699#if defined(TILES)
6700 const int prev_tileset_zoom = tileset_zoom;
6701 while( is_moving_zone && square_dist( start_point, end_point ) > 256 / get_zoom() &&
6702 get_zoom() != 4 ) {
6703 zoom_out();
6704 }
6706#endif
6707 do {
6708 u.view_offset = center - u.pos();
6709 if( select_zone ) {
6710 if( has_first_point ) {
6711 zone_start = start_point;
6712 zone_end = lp;
6713 } else {
6714 zone_start = lp;
6715 zone_end = cata::nullopt;
6716 }
6717 // Actually accessed from the terrain overlay callback `zone_cb` in the
6718 // call to `ui_manager::redraw`.
6719 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6720 zone_blink = blink;
6721 }
6722
6723 if( is_moving_zone ) {
6724 zone_start = lp - ( start_point + end_point ) / 2 + start_point;
6725 zone_end = lp - ( start_point + end_point ) / 2 + end_point;
6726 // Actually accessed from the terrain overlay callback `zone_cb` in the
6727 // call to `ui_manager::redraw`.
6728 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6729 zone_blink = blink;
6730 }
6733 if( ( select_zone && has_first_point ) || is_moving_zone ) {
6734 ctxt.set_timeout( get_option<int>( "BLINK_SPEED" ) );
6735 }
6736
6737 //Wait for input
6738 // only specify a timeout here if "EDGE_SCROLL" is enabled
6739 // otherwise use the previously set timeout
6740 const tripoint edge_scroll = mouse_edge_scrolling_terrain( ctxt );
6741 const int scroll_timeout = get_option<int>( "EDGE_SCROLL" );
6742 const bool edge_scrolling = edge_scroll != tripoint_zero && scroll_timeout >= 0;
6743 if( edge_scrolling ) {
6744 action = ctxt.handle_input( scroll_timeout );
6745 } else {
6746 action = ctxt.handle_input();
6747 }
6748 if( ( action == "LEVEL_UP" || action == "LEVEL_DOWN" || action == "MOUSE_MOVE" ||
6749 ctxt.get_direction( action ) ) && ( ( select_zone && has_first_point ) || is_moving_zone ) ) {
6750 blink = true; // Always draw blink symbols when moving cursor
6751 } else if( action == "TIMEOUT" ) {
6752 blink = !blink;
6753 }
6754 if( action == "LIST_ITEMS" ) {
6756 } else if( action == "TOGGLE_FAST_SCROLL" ) {
6757 fast_scroll = !fast_scroll;
6758 } else if( action == "toggle_pixel_minimap" ) {
6760
6761 if( show_window && ui ) {
6762 ui->mark_resize();
6763 }
6764 } else if( action == "LEVEL_UP" || action == "LEVEL_DOWN" ) {
6765 if( !allow_zlev_move ) {
6766 continue;
6767 }
6768
6769 const int dz = ( action == "LEVEL_UP" ? 1 : -1 );
6770 lz = clamp( lz + dz, min_levz, max_levz );
6771 center.z = clamp( center.z + dz, min_levz, max_levz );
6772
6773 add_msg( m_debug, "levx: %d, levy: %d, levz: %d", get_levx(), get_levy(), center.z );
6774 u.view_offset.z = center.z - u.posz();
6776 } else if( action == "TRAVEL_TO" ) {
6777 if( !u.sees( lp ) ) {
6778 add_msg( _( "You can't see that destination." ) );
6779 continue;
6780 }
6781
6782 auto route = m.route( u.pos(), lp, u.get_pathfinding_settings(), u.get_path_avoid() );
6783 if( route.size() > 1 ) {
6784 route.pop_back();
6785 u.set_destination( route );
6786 } else {
6787 add_msg( m_info, _( "You can't travel there." ) );
6788 continue;
6789 }
6790 } else if( action == "debug_scent" || action == "debug_scent_type" ) {
6792 display_scent();
6793 }
6794 } else if( action == "debug_temp" ) {
6797 }
6798 } else if( action == "debug_lighting" ) {
6801 }
6802 } else if( action == "debug_transparency" ) {
6805 }
6806 } else if( action == "debug_radiation" ) {
6809 }
6810 } else if( action == "debug_submap_grid" ) {
6811 g->debug_submap_grid_overlay = !g->debug_submap_grid_overlay;
6812 } else if( action == "debug_hour_timer" ) {
6814 } else if( action == "EXTENDED_DESCRIPTION" ) {
6816 } else if( action == "CENTER" ) {
6817 center = u.pos();
6818 lp = u.pos();
6819 u.view_offset.z = 0;
6820 } else if( action == "MOUSE_MOVE" || action == "TIMEOUT" ) {
6821 // This block is structured this way so that edge scroll can work
6822 // whether the mouse is moving at the edge or simply stationary
6823 // at the edge. But even if edge scroll isn't in play, there's
6824 // other things for us to do here.
6825
6826 if( edge_scrolling ) {
6827 center += action == "MOUSE_MOVE" ? edge_scroll * 2 : edge_scroll;
6828 } else if( action == "MOUSE_MOVE" ) {
6829 const cata::optional<tripoint> mouse_pos = ctxt.get_coordinates( w_terrain );
6830 if( mouse_pos ) {
6831 lx = mouse_pos->x;
6832 ly = mouse_pos->y;
6833 }
6834 }
6835 } else if( cata::optional<tripoint> vec = ctxt.get_direction( action ) ) {
6836 if( fast_scroll ) {
6837 vec->x *= soffset;
6838 vec->y *= soffset;
6839 }
6840
6841 lx = lx + vec->x;
6842 ly = ly + vec->y;
6843 center.x = center.x + vec->x;
6844 center.y = center.y + vec->y;
6845 } else if( action == "throw_blind" ) {
6846 result.peek_action = PA_BLIND_THROW;
6847 } else if( action == "zoom_in" ) {
6848 center.x = lp.x;
6849 center.y = lp.y;
6850 zoom_in();
6852 } else if( action == "zoom_out" ) {
6853 center.x = lp.x;
6854 center.y = lp.y;
6855 zoom_out();
6857 }
6858 } while( action != "QUIT" && action != "CONFIRM" && action != "SELECT" && action != "TRAVEL_TO" &&
6859 action != "throw_blind" );
6860
6861 if( m.has_zlevels() && center.z != old_levz ) {
6862 m.invalidate_map_cache( old_levz );
6863 m.build_map_cache( old_levz );
6864 u.view_offset.z = 0;
6865 }
6866
6867 ctxt.reset_timeout();
6868 u.view_offset = prev_offset;
6869 zone_cb = nullptr;
6870 is_looking = false;
6871
6873 bVMonsterLookFire = true;
6874
6875 if( action == "CONFIRM" || action == "SELECT" ) {
6876 result.position = is_moving_zone ? zone_start : lp;
6877 }
6878
6879#if defined(TILES)
6880 if( is_moving_zone && get_zoom() != prev_tileset_zoom ) {
6881 // Reset the tileset zoom to the previous value
6882 set_zoom( prev_tileset_zoom );
6884 }
6885#endif
6886
6887 return result;
6888}
bool pixel_minimap_option
Whether to show the pixel minimap.
tripoint mouse_edge_scrolling_terrain(input_context &ctxt)
Used to implement mouse "edge scrolling".
Definition: game.cpp:2079
void set_zoom(int level)
Definition: game.cpp:7045
void draw_look_around_cursor(const tripoint &lp, const visibility_variables &cache)
Definition: game.cpp:5646
void extended_description(const tripoint &p)
Long description of (visible) things at tile.
void pre_print_all_tile_info(const tripoint &lp, const catacurses::window &w_info, int &line, int last_line, const visibility_variables &cache)
Definition: game.cpp:6525
int get_zoom() const
Definition: game.cpp:7057
const visibility_variables & get_visibility_variables_cache() const
Definition: map.cpp:5718
void invalidate_map_cache(const int zlev)
Definition: map.cpp:8887
std::vector< window_panel > & get_current_layout()
Definition: panels.cpp:2159
int square_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:505
static shared_ptr_fast< game::draw_callback_t > create_zone_callback(const cata::optional< tripoint > &zone_start, const cata::optional< tripoint > &zone_end, const bool &zone_blink, const bool &zone_cursor, const bool &is_moving_zone=false)
Definition: game.cpp:3013
@ PA_BLIND_THROW
Definition: game.h:122
static constexpr int OVERMAP_HEIGHT
static constexpr int OVERMAP_DEPTH
int right_print(const catacurses::window &w, const int line, const int right_indent, const nc_color &FG, const std::string &text)
Definition: output.cpp:461

References _, action, add_draw_callback(), add_msg(), map::build_map_cache(), bVMonsterLookFire, c_green, c_light_gray, c_light_green, c_white, center, center_print(), clamp(), create_zone_callback(), display_lighting(), display_radiation(), display_scent(), display_temperature(), display_transparency(), draw_border(), draw_look_around_cursor(), extended_description(), fov_3d_z_range, g, input_context::get_action_name(), input_context::get_coordinates(), panel_manager::get_current_layout(), input_context::get_desc(), input_context::get_direction(), get_levx(), get_levy(), get_levz(), panel_manager::get_manager(), Character::get_path_avoid(), Character::get_pathfinding_settings(), map::get_visibility_variables_cache(), panel_manager::get_width_left(), get_zoom(), catacurses::getmaxy(), input_context::handle_input(), map::has_zlevels(), invalidate_main_ui_adaptor(), map::invalidate_map_cache(), is_looking, MAP_SHARING::isCompetitive(), MAP_SHARING::isDebugger(), list_items_monsters(), m, m_debug, m_info, mark_main_ui_adaptor_resize(), mouse_edge_scrolling_terrain(), mvwprintz(), catacurses::newwin(), cata::nullopt, OVERMAP_DEPTH, OVERMAP_HEIGHT, PA_BLIND_THROW, pixel_minimap_option, Character::pos(), Character::posz(), pre_print_all_tile_info(), ui_manager::redraw(), reenter_fullscreen(), input_context::register_action(), input_context::register_directions(), input_context::reset_timeout(), right_print(), map::route(), Character::sees(), Character::set_destination(), input_context::set_iso(), input_context::set_timeout(), set_zoom(), square_dist(), string_format(), temp_exit_fullscreen(), TERMX, TERMY, tileset_zoom, toggle_debug_hour_timer(), toggle_pixel_minimap(), tripoint_zero, u, map::update_visibility_cache(), use_tiles, player::view_offset, w_pixel_minimap, w_terrain, catacurses::werase(), catacurses::wnoutrefresh(), tripoint::x, tripoint::y, tripoint::z, zoom_in(), and zoom_out().

◆ look_debug()

cata::optional< tripoint > game::look_debug ( )

Definition at line 5639 of file game.cpp.

5640{
5641 editmap edit;
5642 return edit.edit();
5643}
cata::optional< tripoint > edit()
Definition: editmap.cpp:340

References editmap::edit().

◆ mark_main_ui_adaptor_resize()

void game::mark_main_ui_adaptor_resize ( ) const

Definition at line 2970 of file game.cpp.

2971{
2973 if( ui ) {
2974 ui->mark_resize();
2975 }
2976}

References main_ui_adaptor.

Referenced by handle_action(), look_around(), toggle_fullscreen(), and toggle_pixel_minimap().

◆ memorial()

memorial_logger & game::memorial ( )

Definition at line 2712 of file game.cpp.

2713{
2714 return *memorial_logger_ptr;
2715}

References memorial_logger_ptr.

Referenced by cleanup_at_end(), load(), save_player_data(), win(), win_screen(), and write_memorial_file().

◆ mon_info()

void game::mon_info ( const catacurses::window w,
int  hor_padding = 0 
)

Definition at line 3661 of file game.cpp.

3662{
3663 const monster_visible_info &mon_visible = u.get_mon_visible();
3664 const auto &unique_types = mon_visible.unique_types;
3665 const auto &unique_mons = mon_visible.unique_mons;
3666 const auto &dangerous = mon_visible.dangerous;
3667
3668 const int width = getmaxx( w ) - 2 * hor_padding;
3669 const int maxheight = getmaxy( w );
3670
3671 const int startrow = 0;
3672
3673 // Print the direction headings
3674 // Reminder:
3675 // 7 0 1 unique_types uses these indices;
3676 // 6 8 2 0-7 are provide by direction_from()
3677 // 5 4 3 8 is used for local monsters (for when we explain them below)
3678
3679 const std::array<std::string, 8> dir_labels = {{
3680 _( "North:" ), _( "NE:" ), _( "East:" ), _( "SE:" ),
3681 _( "South:" ), _( "SW:" ), _( "West:" ), _( "NW:" )
3682 }
3683 };
3684 std::array<int, 8> widths;
3685 for( int i = 0; i < 8; i++ ) {
3686 widths[i] = utf8_width( dir_labels[i] );
3687 }
3688 std::array<int, 8> xcoords;
3689 const std::array<int, 8> ycoords = {{ 0, 0, 1, 2, 2, 2, 1, 0 }};
3690 xcoords[0] = xcoords[4] = width / 3;
3691 xcoords[1] = xcoords[3] = xcoords[2] = ( width / 3 ) * 2;
3692 xcoords[5] = xcoords[6] = xcoords[7] = 0;
3693 //for the alignment of the 1,2,3 rows on the right edge
3694 xcoords[2] -= utf8_width( _( "East:" ) ) - utf8_width( _( "NE:" ) );
3695 for( int i = 0; i < 8; i++ ) {
3696 nc_color c = unique_types[i].empty() && unique_mons[i].empty() ? c_dark_gray
3697 : ( dangerous[i] ? c_light_red : c_light_gray );
3698 mvwprintz( w, point( xcoords[i] + hor_padding, ycoords[i] + startrow ), c, dir_labels[i] );
3699 }
3700
3701 // Print the symbols of all monsters in all directions.
3702 for( int i = 0; i < 8; i++ ) {
3703 point pr( xcoords[i] + widths[i] + 1, ycoords[i] + startrow );
3704
3705 // The list of symbols needs a space on each end.
3706 int symroom = ( width / 3 ) - widths[i] - 2;
3707 const int typeshere_npc = unique_types[i].size();
3708 const int typeshere_mon = unique_mons[i].size();
3709 const int typeshere = typeshere_mon + typeshere_npc;
3710 for( int j = 0; j < typeshere && j < symroom; j++ ) {
3711 nc_color c;
3712 std::string sym;
3713 if( symroom < typeshere && j == symroom - 1 ) {
3714 // We've run out of room!
3715 c = c_white;
3716 sym = "+";
3717 } else if( j < typeshere_npc ) {
3718 switch( unique_types[i][j]->get_attitude() ) {
3719 case NPCATT_KILL:
3720 c = c_red;
3721 break;
3722 case NPCATT_FOLLOW:
3723 c = c_light_green;
3724 break;
3725 default:
3726 c = c_pink;
3727 break;
3728 }
3729 sym = "@";
3730 } else {
3731 const mtype &mt = *unique_mons[i][j - typeshere_npc].first;
3732 c = mt.color;
3733 sym = mt.sym;
3734 }
3735 mvwprintz( w, pr, c, sym );
3736
3737 pr.x++;
3738 }
3739 }
3740
3741 // Now we print their full names!
3742 struct nearest_loc_and_cnt {
3743 int nearest_loc;
3744 int cnt;
3745 };
3746 std::map<const mtype *, nearest_loc_and_cnt> all_mons;
3747 for( int loc = 0; loc < 9; loc++ ) {
3748 for( const std::pair<const mtype *, int> &mon : unique_mons[loc] ) {
3749 const auto mon_it = all_mons.find( mon.first );
3750 if( mon_it == all_mons.end() ) {
3751 all_mons.emplace( mon.first, nearest_loc_and_cnt{ loc, mon.second } );
3752 } else {
3753 // 8 being the nearest location (local monsters)
3754 mon_it->second.nearest_loc = std::max( mon_it->second.nearest_loc, loc );
3755 mon_it->second.cnt += mon.second;
3756 }
3757 }
3758 }
3759 std::vector<std::pair<const mtype *, int>> mons_at[9];
3760 for( const std::pair<const mtype *const, nearest_loc_and_cnt> &mon : all_mons ) {
3761 mons_at[mon.second.nearest_loc].emplace_back( mon.first, mon.second.cnt );
3762 }
3763
3764 // Start printing monster names on row 4. Rows 0-2 are for labels, and row 3
3765 // is blank.
3766 point pr( hor_padding, 4 + startrow );
3767
3768 // Print monster names, starting with those at location 8 (nearby).
3769 for( int j = 8; j >= 0 && pr.y < maxheight; j-- ) {
3770 // Separate names by some number of spaces (more for local monsters).
3771 int namesep = ( j == 8 ? 2 : 1 );
3772 for( const std::pair<const mtype *, int> &mon : mons_at[j] ) {
3773 const mtype *const type = mon.first;
3774 const int count = mon.second;
3775 if( pr.y >= maxheight ) {
3776 // no space to print to anyway
3777 break;
3778 }
3779
3780 const mtype &mt = *type;
3781 std::string name = mt.nname( count );
3782 // Some languages don't have plural forms, but we want to always
3783 // omit 1.
3784 if( count != 1 ) {
3785 name = string_format( pgettext( "monster count and name", "%1$d %2$s" ),
3786 count, name );
3787 }
3788
3789 // Move to the next row if necessary. (The +2 is for the "Z ").
3790 if( pr.x + 2 + utf8_width( name ) >= width ) {
3791 pr.y++;
3792 pr.x = hor_padding;
3793 }
3794
3795 if( pr.y < maxheight ) { // Don't print if we've overflowed
3796 mvwprintz( w, pr, mt.color, mt.sym );
3797 pr.x += 2; // symbol and space
3798 nc_color danger = c_dark_gray;
3799 if( mt.difficulty >= 30 ) {
3800 danger = c_red;
3801 } else if( mt.difficulty >= 16 ) {
3802 danger = c_light_red;
3803 } else if( mt.difficulty >= 8 ) {
3804 danger = c_white;
3805 } else if( mt.agro > 0 ) {
3806 danger = c_light_gray;
3807 }
3808 mvwprintz( w, pr, danger, name );
3809 pr.x += utf8_width( name ) + namesep;
3810 }
3811 }
3812 }
3813}
@ NPCATT_KILL
Definition: npc.h:91
@ NPCATT_FOLLOW
Definition: npc.h:84
std::vector< std::pair< const mtype *, int > > unique_mons[9]
Definition: avatar.h:48
bool dangerous[8]
Definition: avatar.h:51
std::vector< npc * > unique_types[9]
Definition: avatar.h:47
Definition: mtype.h:208
std::string sym
UTF-8 encoded symbol, should be exactly one cell wide.
Definition: mtype.h:256
nc_color color
Definition: mtype.h:261
int difficulty
Definition: mtype.h:267
int agro
e.g.
Definition: mtype.h:272

References _, mtype::agro, c, c_dark_gray, c_light_gray, c_light_green, c_light_red, c_pink, c_red, c_white, mtype::color, detail::count(), monster_visible_info::dangerous, mtype::difficulty, avatar::get_mon_visible(), catacurses::getmaxx(), catacurses::getmaxy(), mvwprintz(), om_direction::name(), mtype::nname(), NPCATT_FOLLOW, NPCATT_KILL, pgettext(), string_format(), mtype::sym, type, u, monster_visible_info::unique_mons, monster_visible_info::unique_types, utf8_width(), point::x, and point::y.

◆ mon_info_update()

void game::mon_info_update ( )

Definition at line 3815 of file game.cpp.

3816{
3817 int newseen = 0;
3818 const int safe_proxy_dist = get_option<int>( "SAFEMODEPROXIMITY" );
3819 const int iProxyDist = ( safe_proxy_dist <= 0 ) ? MAX_VIEW_DISTANCE :
3820 safe_proxy_dist;
3821
3822 monster_visible_info &mon_visible = u.get_mon_visible();
3823 auto &new_seen_mon = mon_visible.new_seen_mon;
3824 auto &unique_types = mon_visible.unique_types;
3825 auto &unique_mons = mon_visible.unique_mons;
3826 auto &dangerous = mon_visible.dangerous;
3827
3828 // 7 0 1 unique_types uses these indices;
3829 // 6 8 2 0-7 are provide by direction_from()
3830 // 5 4 3 8 is used for local monsters (for when we explain them below)
3831 for( auto &t : unique_types ) {
3832 t.clear();
3833 }
3834 for( auto &m : unique_mons ) {
3835 m.clear();
3836 }
3837 std::fill( dangerous, dangerous + 8, false );
3838
3839 const tripoint view = u.pos() + u.view_offset;
3840 new_seen_mon.clear();
3841
3842 // TODO: no reason to have it static here
3843 static time_point previous_turn = calendar::start_of_cataclysm;
3844 const time_duration sm_ignored_time = time_duration::from_turns(
3845 get_option<int>( "SAFEMODEIGNORETURNS" ) );
3846
3848 monster *m = dynamic_cast<monster *>( c );
3849 npc *p = dynamic_cast<npc *>( c );
3850 const direction dir_to_mon = direction_from( view.xy(), point( c->posx(), c->posy() ) );
3851 const int mx = POSX + ( c->posx() - view.x );
3852 const int my = POSY + ( c->posy() - view.y );
3853 int index = 8;
3854 if( !is_valid_in_w_terrain( point( mx, my ) ) ) {
3855 // for compatibility with old code, see diagram below, it explains the values for index,
3856 // also might need revisiting one z-levels are in.
3857 switch( dir_to_mon ) {
3861 index = 7;
3862 break;
3864 case direction::NORTH:
3866 index = 0;
3867 break;
3871 index = 1;
3872 break;
3874 case direction::WEST:
3876 index = 6;
3877 break;
3879 case direction::CENTER:
3881 index = 8;
3882 break;
3884 case direction::EAST:
3886 index = 2;
3887 break;
3891 index = 5;
3892 break;
3894 case direction::SOUTH:
3896 index = 4;
3897 break;
3901 index = 3;
3902 break;
3903 }
3904 }
3905
3906 rule_state safemode_state = RULE_NONE;
3907 const bool safemode_empty = get_safemode().empty();
3908
3909 if( m != nullptr ) {
3910 //Safemode monster check
3911 monster &critter = *m;
3912
3913 const monster_attitude matt = critter.attitude( &u );
3914 const int mon_dist = rl_dist( u.pos(), critter.pos() );
3915 safemode_state = get_safemode().check_monster( critter.name(), critter.attitude_to( u ), mon_dist );
3916
3917 if( ( !safemode_empty && safemode_state == RULE_BLACKLISTED ) || ( safemode_empty &&
3918 ( MATT_ATTACK == matt || MATT_FOLLOW == matt ) ) ) {
3919 if( index < 8 && critter.sees( g->u ) ) {
3920 dangerous[index] = true;
3921 }
3922
3923 if( !safemode_empty || mon_dist <= iProxyDist ) {
3924 bool passmon = false;
3925 if( critter.ignoring > 0 ) {
3926 if( safe_mode != SAFE_MODE_ON ) {
3927 critter.ignoring = 0;
3928 } else if( ( sm_ignored_time == 0_seconds || ( critter.lastseen_turn &&
3929 *critter.lastseen_turn > calendar::turn - sm_ignored_time ) ) &&
3930 ( mon_dist > critter.ignoring / 2 || mon_dist < 6 ) ) {
3931 passmon = true;
3932 }
3933 critter.lastseen_turn = calendar::turn;
3934 }
3935
3936 if( !passmon ) {
3937 newseen++;
3938 new_seen_mon.push_back( shared_from( critter ) );
3939 }
3940 }
3941 }
3942
3943 std::vector<std::pair<const mtype *, int>> &vec = unique_mons[index];
3944 const auto mon_it = std::find_if( vec.begin(), vec.end(),
3945 [&]( const std::pair<const mtype *, int> &elem ) {
3946 return elem.first == critter.type;
3947 } );
3948 if( mon_it == vec.end() ) {
3949 vec.emplace_back( critter.type, 1 );
3950 } else {
3951 mon_it->second++;
3952 }
3953 } else if( p != nullptr ) {
3954 //Safe mode NPC check
3955
3956 const int npc_dist = rl_dist( u.pos(), p->pos() );
3957 safemode_state = get_safemode().check_monster( get_safemode().npc_type_name(), p->attitude_to( u ),
3958 npc_dist );
3959
3960 if( ( !safemode_empty && safemode_state == RULE_BLACKLISTED ) || ( safemode_empty &&
3961 p->get_attitude() == NPCATT_KILL ) ) {
3962 if( !safemode_empty || npc_dist <= iProxyDist ) {
3963 newseen++;
3964 }
3965 }
3966 unique_types[index].push_back( p );
3967 }
3968 }
3969
3970 if( newseen > mostseen ) {
3971 if( newseen - mostseen == 1 ) {
3972 if( !new_seen_mon.empty() ) {
3973 monster &critter = *new_seen_mon.back();
3975 string_format( _( "%s spotted!" ), critter.name() ) );
3976 if( u.has_trait( trait_id( "M_DEFENDER" ) ) && critter.type->in_species( PLANT ) ) {
3977 add_msg( m_warning, _( "We have detected a %s - an enemy of the Mycus!" ), critter.name() );
3979 u.add_effect( effect_adrenaline_mycus, 30_minutes );
3980 } else if( u.get_effect_int( effect_adrenaline_mycus ) == 1 ) {
3981 // Triffids present. We ain't got TIME to adrenaline comedown!
3982 u.add_effect( effect_adrenaline_mycus, 15_minutes );
3983 u.mod_pain( 3 ); // Does take it out of you, though
3984 add_msg( m_info, _( "Our fibers strain with renewed wrath!" ) );
3985 }
3986 }
3987 } else {
3988 //Hostile NPC
3990 _( "Hostile survivor spotted!" ) );
3991 }
3992 } else {
3994 }
3996 if( safe_mode == SAFE_MODE_ON ) {
3998 }
3999 } else if( calendar::turn > previous_turn && get_option<bool>( "AUTOSAFEMODE" ) &&
4000 newseen == 0 ) { // Auto-safe mode, but only if it's a new turn
4001 turnssincelastmon += to_turns<int>( calendar::turn - previous_turn );
4002 if( turnssincelastmon >= get_option<int>( "AUTOSAFEMODETURNS" ) && safe_mode == SAFE_MODE_OFF ) {
4004 add_msg( m_info, _( "Safe mode ON!" ) );
4005 }
4006 }
4007
4008 if( newseen == 0 && safe_mode == SAFE_MODE_STOP ) {
4010 }
4011
4012 previous_turn = calendar::turn;
4013 mostseen = newseen;
4014}
int get_effect_int(const efftype_id &eff_id, body_part bp=num_bp) const
Returns the intensity of the matching effect.
Definition: creature.cpp:1256
virtual bool sees(const Creature &critter) const
The functions check whether this creature can see the target.
Definition: creature.cpp:203
bool cancel_activity_or_ignore_query(distraction_type type, const std::string &text)
Asks if the player wants to cancel their activity and if so cancels it.
Definition: game.cpp:1700
monster_attitude attitude(const Character *u=nullptr) const
Definition: monster.cpp:1095
cata::optional< time_point > lastseen_turn
Definition: monster.h:505
Attitude attitude_to(const Creature &other) const override
Attitude (of this creature) towards another creature.
Definition: npc.cpp:2093
rule_state check_monster(const std::string &creature_name_in, Creature::Attitude attitude_in, int proximity_in) const
bool empty() const
rule_state
Definition: enums.h:51
@ RULE_NONE
Definition: enums.h:52
bool is_valid_in_w_terrain(const point &p)
Definition: game.cpp:286
static const species_id PLANT("PLANT")
static const efftype_id effect_adrenaline_mycus("adrenaline_mycus")
static constexpr int MAPSIZE_X
monster_attitude
Definition: monster.h:55
@ MATT_FOLLOW
Definition: monster.h:61
@ MATT_ATTACK
Definition: monster.h:62
FMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t< Char > &fill)
bool in_species(const species_id &spec) const
Definition: mtype.cpp:122

References _, ABOVECENTER, ABOVEEAST, ABOVENORTH, ABOVENORTHEAST, ABOVENORTHWEST, ABOVESOUTH, ABOVESOUTHEAST, ABOVESOUTHWEST, ABOVEWEST, Creature::add_effect(), add_msg(), monster::attitude(), monster::attitude_to(), npc::attitude_to(), BELOWCENTER, BELOWEAST, BELOWNORTH, BELOWNORTHEAST, BELOWNORTHWEST, BELOWSOUTH, BELOWSOUTHEAST, BELOWSOUTHWEST, BELOWWEST, c, cancel_activity_or_ignore_query(), CENTER, safemode::check_monster(), monster_visible_info::dangerous, direction_from(), EAST, effect_adrenaline_mycus, safemode::empty(), detail::fill(), time_duration::from_turns(), g, npc::get_attitude(), Creature::get_effect_int(), avatar::get_mon_visible(), get_safemode(), Character::get_visible_creatures(), Creature::has_effect(), Character::has_trait(), hostile_spotted_far, monster::ignoring, mtype::in_species(), is_valid_in_w_terrain(), monster::lastseen_turn, m, m_info, m_warning, MAPSIZE_X, MATT_ATTACK, MATT_FOLLOW, MAX_VIEW_DISTANCE, Character::mod_pain(), mostseen, monster::name(), monster_visible_info::new_seen_mon, NORTH, NORTHEAST, NORTHWEST, NPCATT_KILL, PLANT, Character::pos(), monster::pos(), POSX, POSY, rl_dist(), RULE_BLACKLISTED, RULE_NONE, safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, SAFE_MODE_STOP, Creature::sees(), set_safe_mode(), shared_from(), SOUTH, SOUTHEAST, SOUTHWEST, calendar::start_of_cataclysm, string_format(), calendar::turn, turnssincelastmon, monster::type, u, monster_visible_info::unique_mons, monster_visible_info::unique_types, player::view_offset, WEST, tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by do_turn().

◆ monmove()

void game::monmove ( )
private

Definition at line 4051 of file game.cpp.

4052{
4053 cleanup_dead();
4054
4055 for( monster &critter : all_monsters() ) {
4056 // Critters in impassable tiles get pushed away, unless it's not impassable for them
4057 if( !critter.is_dead() && m.impassable( critter.pos() ) && !critter.can_move_to( critter.pos() ) ) {
4058 std::string msg = string_format( "%s can't move to its location! %s %s", critter.name(),
4059 critter.pos().to_string(), m.tername( critter.pos() ) );
4060 dbg( DL::Error ) << msg;
4061 add_msg( m_debug, msg );
4062 bool okay = false;
4063 for( const tripoint &dest : m.points_in_radius( critter.pos(), 3 ) ) {
4064 if( critter.can_move_to( dest ) && is_empty( dest ) ) {
4065 critter.setpos( dest );
4066 okay = true;
4067 break;
4068 }
4069 }
4070 if( !okay ) {
4071 // die of "natural" cause (overpopulation is natural)
4072 critter.die( nullptr );
4073 }
4074 }
4075
4076 if( !critter.is_dead() ) {
4077 critter.process_items();
4078 }
4079
4080 if( !critter.is_dead() ) {
4081 critter.process_turn();
4082 }
4083
4084 m.creature_in_field( critter );
4085 if( calendar::once_every( 1_days ) ) {
4086 if( critter.has_flag( MF_MILKABLE ) ) {
4087 critter.refill_udders();
4088 }
4089 critter.try_reproduce();
4090 }
4091 while( critter.moves > 0 && !critter.is_dead() && !critter.has_effect( effect_ridden ) ) {
4092 critter.made_footstep = false;
4093 // Controlled critters don't make their own plans
4094 if( !critter.has_effect( effect_ai_controlled ) ) {
4095 // Formulate a path to follow
4096 critter.plan();
4097 }
4098 critter.move(); // Move one square, possibly hit u
4099 critter.process_triggers();
4100 m.creature_in_field( critter );
4101 }
4102
4103 const bionic_id bio_alarm( "bio_alarm" );
4104 if( !critter.is_dead() &&
4105 u.has_active_bionic( bio_alarm ) &&
4106 u.get_power_level() >= bio_alarm->power_trigger &&
4107 rl_dist( u.pos(), critter.pos() ) <= 5 &&
4108 !critter.is_hallucination() ) {
4109 u.mod_power_level( -bio_alarm->power_trigger );
4110 add_msg( m_warning, _( "Your motion alarm goes off!" ) );
4112 _( "Your motion alarm goes off!" ) );
4113 if( u.has_effect( efftype_id( "sleep" ) ) ) {
4114 u.wake_up();
4115 }
4116 }
4117 }
4118
4119 cleanup_dead();
4120
4121 // The remaining monsters are all alive, but may be outside of the reality bubble.
4122 // If so, despawn them. This is not the same as dying, they will be stored for later and the
4123 // monster::die function is not called.
4124 for( monster &critter : all_monsters() ) {
4125 if( critter.posx() < 0 - ( MAPSIZE_X ) / 6 ||
4126 critter.posy() < 0 - ( MAPSIZE_Y ) / 6 ||
4127 critter.posx() > ( MAPSIZE_X * 7 ) / 6 ||
4128 critter.posy() > ( MAPSIZE_Y * 7 ) / 6 ) {
4129 despawn_monster( critter );
4130 }
4131 }
4132
4133 // Now, do active NPCs.
4134 for( npc &guy : g->all_npcs() ) {
4135 int turns = 0;
4136 if( guy.is_mounted() ) {
4137 guy.check_mount_is_spooked();
4138 }
4139 m.creature_in_field( guy );
4140 if( !guy.has_effect( effect_npc_suspend ) ) {
4141 guy.process_turn();
4142 }
4143 while( !guy.is_dead() && guy.moves > 0 && turns < 10 &&
4144 ( !guy.in_sleep_state() || guy.activity.id() == ACT_OPERATION )
4145 ) {
4146 int moves = guy.moves;
4147 guy.move();
4148 if( moves == guy.moves ) {
4149 // Count every time we exit npc::move() without spending any moves.
4150 turns++;
4151 }
4152
4153 // Turn on debug mode when in infinite loop
4154 // It has to be done before the last turn, otherwise
4155 // there will be no meaningful debug output.
4156 if( turns == 9 ) {
4157 debugmsg( "NPC %s entered infinite loop. Turning on debug mode",
4158 guy.name );
4159 debug_mode = true;
4160 }
4161 }
4162
4163 // If we spun too long trying to decide what to do (without spending moves),
4164 // Invoke cognitive suspension to prevent an infinite loop.
4165 if( turns == 10 ) {
4166 add_msg( _( "%s faints!" ), guy.name );
4167 guy.reboot();
4168 }
4169
4170 if( !guy.is_dead() ) {
4171 guy.npc_update_body();
4172 }
4173 }
4174 cleanup_dead();
4175}
void mod_power_level(const units::energy &npower)
Definition: character.cpp:1905
units::energy get_power_level() const
Definition: character.cpp:1885
void wake_up()
Definition: avatar.cpp:958
static const activity_id ACT_OPERATION("ACT_OPERATION")
static const efftype_id effect_npc_suspend("npc_suspend")
static const efftype_id effect_ai_controlled("ai_controlled")
static constexpr int MAPSIZE_Y
@ MF_MILKABLE
Definition: mtype.h:167

References _, ACT_OPERATION, add_msg(), alert, all_monsters(), cancel_activity_or_ignore_query(), cleanup_dead(), map::creature_in_field(), dbg, debug_mode, debugmsg, despawn_monster(), effect_ai_controlled, effect_npc_suspend, effect_ridden, Error, g, Character::get_power_level(), Character::has_active_bionic(), Creature::has_effect(), map::impassable(), is_empty(), m, m_debug, m_warning, MAPSIZE_X, MAPSIZE_Y, MF_MILKABLE, Character::mod_power_level(), calendar::once_every(), map::points_in_radius(), Character::pos(), bionic_data::power_trigger, rl_dist(), string_format(), map::tername(), u, and avatar::wake_up().

Referenced by do_turn().

◆ mouse_edge_scrolling()

std::pair< tripoint, tripoint > game::mouse_edge_scrolling ( input_context ctxt,
int  speed,
const tripoint last,
bool  iso 
)
private

Definition at line 2026 of file game.cpp.

2028{
2029 const int rate = get_option<int>( "EDGE_SCROLL" );
2030 auto ret = std::make_pair( tripoint_zero, last );
2031 if( rate == -1 ) {
2032 // Fast return when the option is disabled.
2033 return ret;
2034 }
2035 // Ensure the parameters are used even if the #if below is false
2036 ( void ) ctxt;
2037 ( void ) speed;
2038 ( void ) iso;
2039#if (defined TILES || defined _WIN32 || defined WINDOWS)
2040 auto now = std::chrono::steady_clock::now();
2041 if( now < last_mouse_edge_scroll + std::chrono::milliseconds( rate ) ) {
2042 return ret;
2043 } else {
2045 }
2046 const input_event event = ctxt.get_raw_input();
2047 if( event.type == CATA_INPUT_MOUSE ) {
2048 const point threshold( projected_window_width() / 100, projected_window_height() / 100 );
2049 if( event.mouse_pos.x <= threshold.x ) {
2050 ret.first.x -= speed;
2051 if( iso ) {
2052 ret.first.y -= speed;
2053 }
2054 } else if( event.mouse_pos.x >= projected_window_width() - threshold.x ) {
2055 ret.first.x += speed;
2056 if( iso ) {
2057 ret.first.y += speed;
2058 }
2059 }
2060 if( event.mouse_pos.y <= threshold.y ) {
2061 ret.first.y -= speed;
2062 if( iso ) {
2063 ret.first.x += speed;
2064 }
2065 } else if( event.mouse_pos.y >= projected_window_height() - threshold.y ) {
2066 ret.first.y += speed;
2067 if( iso ) {
2068 ret.first.x -= speed;
2069 }
2070 }
2071 ret.second = ret.first;
2072 } else if( event.type == CATA_INPUT_TIMEOUT ) {
2073 ret.first = ret.second;
2074 }
2075#endif
2076 return ret;
2077}
@ CATA_INPUT_TIMEOUT
Definition: input.h:81
@ CATA_INPUT_MOUSE
Definition: input.h:84

References CATA_INPUT_MOUSE, CATA_INPUT_TIMEOUT, input_context::get_raw_input(), iso, last, last_mouse_edge_scroll, cata::hash64_detail::ret, tripoint_zero, point::x, and point::y.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ mouse_edge_scrolling_overmap()

tripoint game::mouse_edge_scrolling_overmap ( input_context ctxt)

This variant is suitable for the overmap.

Definition at line 2088 of file game.cpp.

2089{
2090 // overmap has no iso mode
2094 return ret.first;
2095}
std::pair< tripoint, tripoint > mouse_edge_scrolling(input_context &ctxt, int speed, const tripoint &last, bool iso)
Definition: game.cpp:2026
tripoint last_mouse_edge_scroll_vector_terrain
Definition: game.h:1069
tripoint last_mouse_edge_scroll_vector_overmap
Definition: game.h:1070

References last_mouse_edge_scroll_vector_overmap, last_mouse_edge_scroll_vector_terrain, mouse_edge_scrolling(), cata::hash64_detail::ret, and tripoint_zero.

◆ mouse_edge_scrolling_terrain()

tripoint game::mouse_edge_scrolling_terrain ( input_context ctxt)

Used to implement mouse "edge scrolling".

Returns a tripoint which is a vector of the resulting "move", i.e. (0, 0, 0) if the mouse is not at the edge of the screen, otherwise some (x, y, 0) depending on which edges are hit. This variant adjust scrolling speed according to zoom level, making it suitable when viewing the "terrain".

Definition at line 2079 of file game.cpp.

References DEFAULT_TILESET_ZOOM, last_mouse_edge_scroll_vector_overmap, last_mouse_edge_scroll_vector_terrain, mouse_edge_scrolling(), cata::hash64_detail::ret, tile_iso, tileset_zoom, and tripoint_zero.

Referenced by look_around().

◆ move_save_to_graveyard()

void game::move_save_to_graveyard ( const std::string &  dirname)
private

Definition at line 2463 of file game.cpp.

2464{
2465 const std::string save_dir = get_world_base_save_path();
2466 const std::string graveyard_dir = PATH_INFO::graveyarddir() + "/";
2467 const std::string graveyard_save_dir = graveyard_dir + dirname + "/";
2468 const std::string prefix = base64_encode( u.name ) + ".";
2469
2470 if( !assure_dir_exist( graveyard_dir ) ) {
2471 debugmsg( "could not create graveyard path '%s'", graveyard_dir );
2472 }
2473
2474 if( !assure_dir_exist( graveyard_save_dir ) ) {
2475 debugmsg( "could not create graveyard path '%s'", graveyard_save_dir );
2476 }
2477
2478 const auto save_files = get_files_from_path( prefix, save_dir );
2479 if( save_files.empty() ) {
2480 debugmsg( "could not find save files in '%s'", save_dir );
2481 }
2482
2483 for( const auto &src_path : save_files ) {
2484 const std::string dst_path = graveyard_save_dir +
2485 src_path.substr( src_path.rfind( '/' ), std::string::npos );
2486
2487 if( rename_file( src_path, dst_path ) ) {
2488 continue;
2489 }
2490
2491 debugmsg( "could not rename file '%s' to '%s'", src_path, dst_path );
2492
2493 if( remove_file( src_path ) ) {
2494 continue;
2495 }
2496
2497 debugmsg( "could not remove file '%s'", src_path );
2498 }
2499}
@ prefix
Definition: enums.h:79
bool remove_file(const std::string &path)
Remove a file.
Definition: filesystem.cpp:89
bool assure_dir_exist(const std::string &path)
Create directory if it does not exist.
Definition: filesystem.cpp:48
bool rename_file(const std::string &old_path, const std::string &new_path)
Rename a file, overwriting the target.
Definition: filesystem.cpp:105
std::vector< std::string > get_files_from_path(const std::string &pattern, const std::string &root_path, const bool recursive_search, const bool match_extension)
Returns a vector of files or directories matching pattern at root_path.
Definition: filesystem.cpp:366
std::string graveyarddir()
Definition: path_info.cpp:202

References assure_dir_exist(), base64_encode(), debugmsg, get_files_from_path(), get_world_base_save_path(), PATH_INFO::graveyarddir(), Character::name, prefix, remove_file(), rename_file(), and u.

Referenced by cleanup_at_end().

◆ moving_vehicle_dismount()

void game::moving_vehicle_dismount ( const tripoint dest_loc)

Handles players exiting from moving vehicles.

Definition at line 5106 of file game.cpp.

5107{
5108 const optional_vpart_position vp = m.veh_at( u.pos() );
5109 if( !vp ) {
5110 debugmsg( "Tried to exit non-existent vehicle." );
5111 return;
5112 }
5113 vehicle *const veh = &vp->vehicle();
5114 if( u.pos() == dest_loc ) {
5115 debugmsg( "Need somewhere to dismount towards." );
5116 return;
5117 }
5118 tileray ray( dest_loc.xy() + point( -u.posx(), -u.posy() ) );
5119 // TODO:: make dir() const correct!
5120 const units::angle d = ray.dir();
5121 add_msg( _( "You dive from the %s." ), veh->name );
5122 m.unboard_vehicle( u.pos() );
5123 u.moves -= 200;
5124 // Dive three tiles in the direction of tox and toy
5125 fling_creature( &u, d, 30, true );
5126 // Hit the ground according to vehicle speed
5127 if( !m.has_flag( "SWIMMABLE", u.pos() ) ) {
5128 if( veh->velocity > 0 ) {
5129 fling_creature( &u, veh->face.dir(), veh->velocity / static_cast<float>( 100 ) );
5130 } else {
5131 fling_creature( &u, veh->face.dir() + 180_degrees,
5132 -( veh->velocity ) / static_cast<float>( 100 ) );
5133 }
5134 }
5135}
void fling_creature(Creature *c, const units::angle &dir, float flvel, bool controlled=false, bool suppress_map_update=false)
Flings the input creature in the given direction.
Definition: game.cpp:9722

References _, add_msg(), debugmsg, tileray::dir(), vehicle::face, fling_creature(), map::has_flag(), m, Creature::moves, vehicle::name, Character::pos(), Character::posx(), Character::posy(), u, map::unboard_vehicle(), map::veh_at(), vehicle::velocity, and tripoint::xy().

◆ natural_light_level()

float game::natural_light_level ( int  zlev) const

Definition at line 3480 of file game.cpp.

3481{
3482 // ignore while underground or above limits
3483 if( zlev > OVERMAP_HEIGHT || zlev < 0 ) {
3484 return LIGHT_AMBIENT_MINIMAL;
3485 }
3486
3487 if( latest_lightlevels[zlev] > -std::numeric_limits<float>::max() ) {
3488 // Already found the light level for now?
3489 return latest_lightlevels[zlev];
3490 }
3491
3492 float ret = LIGHT_AMBIENT_MINIMAL;
3493
3494 // Sunlight/moonlight related stuff
3496 if( !weather.lightning_active ) {
3498 } else {
3499 // Recent lightning strike has lit the area
3501 }
3502
3504
3505 // Artifact light level changes here. Even though some of these only have an effect
3506 // aboveground it is cheaper performance wise to simply iterate through the entire
3507 // list once instead of twice.
3508 float mod_ret = -1;
3509 // Each artifact change does std::max(mod_ret, new val) since a brighter end value
3510 // will trump a lower one.
3511 if( const timed_event *e = timed_events.get( TIMED_EVENT_DIM ) ) {
3512 // TIMED_EVENT_DIM slowly dims the natural sky level, then relights it.
3513 const time_duration left = e->when - calendar::turn;
3514 // TIMED_EVENT_DIM has an occurrence date of turn + 50, so the first 25 dim it,
3515 if( left > 25_turns ) {
3516 mod_ret = std::max( static_cast<double>( mod_ret ), ( ret * ( left - 25_turns ) ) / 25_turns );
3517 // and the last 25 scale back towards normal.
3518 } else {
3519 mod_ret = std::max( static_cast<double>( mod_ret ), ( ret * ( 25_turns - left ) ) / 25_turns );
3520 }
3521 }
3523 // TIMED_EVENT_ARTIFACT_LIGHT causes everywhere to become as bright as day.
3524 mod_ret = std::max<float>( ret, default_daylight_level() );
3525 }
3526 // If we had a changed light level due to an artifact event then it overwrites
3527 // the natural light level.
3528 if( mod_ret > -1 ) {
3529 ret = mod_ret;
3530 }
3531
3532 // Cap everything to our minimum light level
3533 ret = std::max<float>( LIGHT_AMBIENT_MINIMAL, ret );
3534
3535 latest_lightlevels[zlev] = ret;
3536
3537 return ret;
3538}
double default_daylight_level()
How much light is provided in full daylight.
Definition: calendar.cpp:62
float sunlight(const time_point &p, const bool vision)
Returns the current sunlight or moonlight level through the preceding functions.
Definition: calendar.cpp:199
std::array< float, OVERMAP_LAYERS > latest_lightlevels
Definition: game.h:1042
bool queued(timed_event_type type) const
timed_event * get(timed_event_type type)
weather_type_id weather_id
Definition: weather.h:193
static constexpr float LIGHT_AMBIENT_MINIMAL
Definition: lightmap.h:12
@ TIMED_EVENT_DIM
Definition: timed_event.h:22
@ TIMED_EVENT_ARTIFACT_LIGHT
Definition: timed_event.h:23

References default_daylight_level(), timed_event_manager::get(), get_weather, latest_lightlevels, left, LIGHT_AMBIENT_MINIMAL, weather_type::light_modifier, OVERMAP_HEIGHT, timed_event_manager::queued(), cata::hash64_detail::ret, sunlight(), TIMED_EVENT_ARTIFACT_LIGHT, TIMED_EVENT_DIM, timed_events, calendar::turn, and weather_manager::weather_id.

Referenced by light_level().

◆ npc_menu()

bool game::npc_menu ( npc who)

Returns true if the menu handled stuff and player shouldn't do anything else.

Perception slightly increases precision when examining NPCs' wounds Firstaid increases precision when examining NPCs' wounds

Definition at line 5237 of file game.cpp.

5238{
5239 enum choices : int {
5240 talk = 0,
5241 swap_pos,
5242 push,
5243 examine_wounds,
5244 use_item,
5245 sort_armor,
5246 attack,
5247 disarm,
5248 steal
5249 };
5250
5251 const bool obeys = debug_mode || ( who.is_player_ally() && !who.in_sleep_state() );
5252
5253 uilist amenu;
5254
5255 amenu.text = string_format( _( "What to do with %s?" ), who.disp_name() );
5256 amenu.addentry( talk, true, 't', _( "Talk" ) );
5257 amenu.addentry( swap_pos, obeys && !who.is_mounted() &&
5258 !u.is_mounted(), 's', _( "Swap positions" ) );
5259 amenu.addentry( push, obeys && !who.is_mounted(), 'p', _( "Push away" ) );
5260 amenu.addentry( examine_wounds, true, 'w', _( "Examine wounds" ) );
5261 amenu.addentry( use_item, true, 'i', _( "Use item on" ) );
5262 amenu.addentry( sort_armor, true, 'r', _( "Sort armor" ) );
5263 amenu.addentry( attack, true, 'a', _( "Attack" ) );
5264 if( !who.is_player_ally() ) {
5265 amenu.addentry( disarm, who.is_armed(), 'd', _( "Disarm" ) );
5266 amenu.addentry( steal, !who.is_enemy(), 'S', _( "Steal" ) );
5267 }
5268
5269 amenu.query();
5270
5271 const int choice = amenu.ret;
5272 if( choice == talk ) {
5273 who.talk_to_u();
5274 } else if( choice == swap_pos ) {
5275 if( !prompt_dangerous_tile( who.pos() ) ) {
5276 return true;
5277 }
5278 // TODO: Make NPCs protest when displaced onto dangerous crap
5279 add_msg( _( "You swap places with %s." ), who.name );
5280 swap_critters( u, who );
5281 // TODO: Make that depend on stuff
5282 u.mod_moves( -200 );
5283 } else if( choice == push ) {
5284 // TODO: Make NPCs protest when displaced onto dangerous crap
5285 tripoint oldpos = who.pos();
5286 who.move_away_from( u.pos(), true );
5287 u.mod_moves( -20 );
5288 if( oldpos != who.pos() ) {
5289 add_msg( _( "%s moves out of the way." ), who.name );
5290 } else {
5291 add_msg( m_warning, _( "%s has nowhere to go!" ), who.name );
5292 }
5293 } else if( choice == examine_wounds ) {
5294 ///\EFFECT_PER slightly increases precision when examining NPCs' wounds
5295
5296 ///\EFFECT_FIRSTAID increases precision when examining NPCs' wounds
5297 const bool precise = u.get_skill_level( skill_firstaid ) * 4 + u.per_cur >= 20;
5298 who.body_window( _( "Limbs of: " ) + who.disp_name(), true, precise, 0, 0, 0, 0.0f, 0.0f, 0.0f,
5299 0.0f, 0.0f );
5300 } else if( choice == use_item ) {
5301 static const std::string heal_string( "heal" );
5302 const auto will_accept = []( const item & it ) {
5303 const auto use_fun = it.get_use( heal_string );
5304 if( use_fun == nullptr ) {
5305 return false;
5306 }
5307
5308 const auto *actor = dynamic_cast<const heal_actor *>( use_fun->get_actor_ptr() );
5309
5310 return actor != nullptr &&
5311 actor->limb_power >= 0 &&
5312 actor->head_power >= 0 &&
5313 actor->torso_power >= 0;
5314 };
5315 item_location loc = game_menus::inv::titled_filter_menu( will_accept, u, _( "Use which item?" ) );
5316
5317 if( !loc ) {
5318 add_msg( _( "Never mind" ) );
5319 return false;
5320 }
5321 item &used = *loc;
5322 bool did_use = u.invoke_item( &used, heal_string, who.pos() );
5323 if( did_use ) {
5324 // Note: exiting a body part selection menu counts as use here
5325 u.mod_moves( -300 );
5326 }
5327 } else if( choice == sort_armor ) {
5328 show_armor_layers_ui( who );
5329 u.mod_moves( -100 );
5330 } else if( choice == attack ) {
5331 if( who.is_enemy() || query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5332 u.melee_attack( who, true );
5333 who.on_attacked( u );
5334 }
5335 } else if( choice == disarm ) {
5336 if( who.is_enemy() || query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5338 }
5339 } else if( choice == steal && query_yn( _( "You may be attacked! Proceed?" ) ) ) {
5341 }
5342
5343 return true;
5344}
hp_part body_window(const std::string &menu_header, bool show_all, bool precise, int normal_bonus, int head_bonus, int torso_bonus, float bleed, float bite, float infect, float bandage_power, float disinfectant_power) const
Displays menu with body part hp, optionally with hp estimation after healing.
Definition: character.cpp:5713
bool in_sleep_state() const override
Definition: character.cpp:9276
void melee_attack(Creature &t, bool allow_special, const matec_id *force_technique=nullptr, bool allow_unarmed=true)
Sets up a melee attack and handles melee attack function calls.
Definition: melee.cpp:387
int per_cur
Definition: character.h:259
bool prompt_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8662
bool swap_critters(Creature &, Creature &)
Swaps positions of two creatures.
Definition: game.cpp:4732
float limb_power
How much hp to restore when healing limbs?
Definition: iuse_actor.h:1011
void talk_to_u(bool radio_contact=false)
Definition: npctalk.cpp:733
void on_attacked(const Creature &attacker)
Definition: npc.cpp:1457
void move_away_from(const tripoint &p, bool no_bash_atk=false, std::set< tripoint > *nomove=nullptr)
Definition: npcmove.cpp:2524
static const skill_id skill_firstaid("firstaid")
static void swap_pos(Creature &caster, const tripoint &target)
void try_disarm_npc(avatar &you, npc &target)
Try to disarm the NPC.
Definition: melee.cpp:2319
void try_steal_from_npc(avatar &you, npc &target)
Try to steal an item from the NPC's inventory.
Definition: melee.cpp:2395
item_location steal(avatar &you, player &victim)
Menu for stealing stuff.
item_location titled_filter_menu(item_filter filter, avatar &you, const std::string &title, const std::string &none_message="")
void push(monster &z)
Definition: monexamine.cpp:610

References _, add_msg(), uilist::addentry(), Character::body_window(), debug_mode, Character::disp_name(), Character::get_skill_level(), Character::in_sleep_state(), avatar::invoke_item(), Character::is_armed(), npc::is_enemy(), Character::is_mounted(), npc::is_player_ally(), heal_actor::limb_power, m_warning, Character::melee_attack(), Creature::mod_moves(), npc::move_away_from(), Character::name, npc::on_attacked(), Character::per_cur, Character::pos(), prompt_dangerous_tile(), monexamine::push(), uilist::query(), query_yn(), uilist::ret, show_armor_layers_ui(), skill_firstaid, game_menus::inv::steal(), string_format(), swap_critters(), swap_pos(), npc::talk_to_u(), uilist::text, game_menus::inv::titled_filter_menu(), avatar_funcs::try_disarm_npc(), avatar_funcs::try_steal_from_npc(), u, and avatar_action::use_item().

Referenced by examine().

◆ num_creatures()

size_t game::num_creatures ( ) const

Returns the approximate number of creatures in the reality bubble.

Because of performance restrictions it may return a slightly incorrect values (as it includes dead, but not yet cleaned up creatures).

Definition at line 4678 of file game.cpp.

4679{
4680 return critter_tracker->size() + active_npc.size() + 1; // 1 == g->u
4681}

References active_npc, and critter_tracker.

Referenced by display_visibility(), and fungal_effects::fungalize().

◆ on_move_effects()

void game::on_move_effects ( )

Definition at line 9680 of file game.cpp.

9681{
9682 // TODO: Move this to a character method
9683 if( !u.is_mounted() ) {
9684 const item muscle( "muscle" );
9685 for( const bionic_id &bid : u.get_bionic_fueled_with( muscle ) ) {
9686 if( u.has_active_bionic( bid ) ) {// active power gen
9687 u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->fuel_efficiency );
9688 } else if( u.has_bionic( bid ) ) {// passive power gen
9689 u.mod_power_level( units::from_kilojoule( muscle.fuel_energy() ) * bid->passive_fuel_efficiency );
9690 }
9691 }
9692 const bionic_id bio_jointservo( "bio_jointservo" );
9694 if( u.movement_mode_is( CMM_RUN ) ) {
9696 } else {
9698 }
9699 }
9700 }
9701
9702 if( u.movement_mode_is( CMM_RUN ) ) {
9703 if( !u.can_run() ) {
9705 }
9706 }
9707
9708 // apply martial art move bonuses
9709 u.martial_arts_data->ma_onmove_effects( u );
9710
9712}
static const bionic_id bio_jointservo("bio_jointservo")
@ CMM_RUN
Definition: character.h:102
bool can_run()
source of truth of whether a Character can run
Definition: character.cpp:1250
bool movement_mode_is(character_movemode mode) const
Check against the character's current movement mode.
Definition: character.cpp:1540
std::vector< bionic_id > get_bionic_fueled_with(const item &it) const
Return bionic_id of bionics able to use it as fuel.
Definition: character.cpp:1846
bool has_bionic(const bionic_id &b) const
Returns true if the player has the entered bionic id.
Definition: character.cpp:1795
void do_ambient()
Definition: sounds.cpp:1614
constexpr quantity< value_type, energy_in_joule_tag > from_kilojoule(const value_type v)
Definition: units_energy.h:32
units::energy power_trigger
Power cost when the bionic's special effect is triggered.
Definition: bionics.h:43

References bio_jointservo, Character::can_run(), CMM_RUN, sfx::do_ambient(), units::from_kilojoule(), item::fuel_energy(), Character::get_bionic_fueled_with(), Character::has_active_bionic(), Character::has_bionic(), Character::is_mounted(), Character::martial_arts_data, Character::mod_power_level(), Character::movement_mode_is(), bionic_data::power_trigger, avatar::toggle_run_mode(), and u.

Referenced by phasing_move(), and walk_move().

◆ on_options_changed()

void game::on_options_changed ( )

Should be invoked whenever options change.

Definition at line 9714 of file game.cpp.

9715{
9716#if defined(TILES)
9717 tilecontext->on_options_changed();
9718#endif
9719 grid_tracker_ptr->on_options_changed();
9720}

References grid_tracker_ptr.

◆ open_consume_item_menu()

void game::open_consume_item_menu ( )
private

Definition at line 1494 of file handle_action.cpp.

1495{
1496 uilist as_m;
1497
1498 as_m.text = _( "What do you want to consume?" );
1499
1500 as_m.entries.emplace_back( 0, true, 'f', _( "Food" ) );
1501 as_m.entries.emplace_back( 1, true, 'd', _( "Drink" ) );
1502 as_m.entries.emplace_back( 2, true, 'm', _( "Medication" ) );
1503 as_m.query();
1504
1505 switch( as_m.ret ) {
1506 case 0:
1508 break;
1509 case 1:
1511 break;
1512 case 2:
1514 break;
1515 default:
1516 break;
1517 }
1518}
std::vector< uilist_entry > entries
Definition: ui.h:323
item_location consume_drink(player &p)
Consuming a drink item via a custom menu.
item_location consume_meds(player &p)
Consuming a medication item via a custom menu.
item_location consume_food(player &p)
Consuming a food item via a custom menu.

References _, game_menus::inv::consume_drink(), game_menus::inv::consume_food(), game_menus::inv::consume_meds(), avatar_action::eat(), uilist::entries, uilist::query(), uilist::ret, uilist::text, and u.

Referenced by handle_action().

◆ overmap_npc_move()

void game::overmap_npc_move ( )
private

Definition at line 4177 of file game.cpp.

4178{
4179 std::vector<npc *> travelling_npcs;
4180 static constexpr int move_search_radius = 600;
4181 for( auto &elem : overmap_buffer.get_npcs_near_player( move_search_radius ) ) {
4182 if( !elem ) {
4183 continue;
4184 }
4185 npc *npc_to_add = elem.get();
4186 if( ( !npc_to_add->is_active() || rl_dist( u.pos(), npc_to_add->pos() ) > SEEX * 2 ) &&
4187 npc_to_add->mission == NPC_MISSION_TRAVELLING ) {
4188 travelling_npcs.push_back( npc_to_add );
4189 }
4190 }
4191 for( auto &elem : travelling_npcs ) {
4192 if( elem->has_omt_destination() ) {
4193 if( !elem->omt_path.empty() && rl_dist( elem->omt_path.back(), elem->global_omt_location() ) > 2 ) {
4194 //recalculate path, we got distracted doing something else probably
4195 elem->omt_path.clear();
4196 }
4197 if( elem->omt_path.empty() ) {
4198 const tripoint_abs_omt &from = elem->global_omt_location();
4199 const tripoint_abs_omt &to = elem->goal;
4200 elem->omt_path = overmap_buffer.get_travel_path( elem->global_omt_location(), elem->goal,
4202 if( elem->omt_path.empty() ) {
4203 add_msg( m_debug, "%s couldn't find overmap path from %s to %s",
4204 elem->get_name(), from.to_string(), to.to_string() );
4205 elem->goal = npc::no_goal_point;
4206 elem->mission = NPC_MISSION_NULL;
4207 }
4208 } else {
4209 if( elem->omt_path.back() == elem->global_omt_location() ) {
4210 elem->omt_path.pop_back();
4211 }
4212 // TODO: fix point types
4213 elem->travel_overmap(
4214 project_to<coords::sm>( elem->omt_path.back() ).raw() );
4215 }
4216 reload_npcs();
4217 }
4218 }
4219 return;
4220}
std::vector< tripoint_abs_omt > omt_path
Route for overmap scale traveling.
Definition: character.h:1803
static constexpr tripoint_abs_omt no_goal_point
Definition: npc.h:1297
bool is_active() const
Definition: npc.cpp:2211
std::vector< tripoint_abs_omt > get_travel_path(const tripoint_abs_omt &src, const tripoint_abs_omt &dest, overmap_path_params params)
@ NPC_MISSION_NULL
Definition: npc.h:142
@ NPC_MISSION_TRAVELLING
Definition: npc.h:154
static overmap_path_params for_npc()

References add_msg(), overmap_path_params::for_npc(), overmapbuffer::get_npcs_near_player(), overmapbuffer::get_travel_path(), npc::is_active(), m_debug, npc::mission, npc::no_goal_point, NPC_MISSION_NULL, NPC_MISSION_TRAVELLING, Character::omt_path, overmap_buffer, Character::pos(), reload_npcs(), rl_dist(), SEEX, coords::coord_point< Point, Origin, Scale >::to_string(), and u.

Referenced by do_turn().

◆ peek() [1/2]

void game::peek ( )

Definition at line 5597 of file game.cpp.

5598{
5599 const cata::optional<tripoint> p = choose_direction( _( "Peek where?" ), true );
5600 if( !p ) {
5601 return;
5602 }
5603
5604 if( p->z != 0 ) {
5605 const tripoint old_pos = u.pos();
5606 vertical_move( p->z, false, true );
5607
5608 if( old_pos != u.pos() ) {
5609 look_around();
5610 vertical_move( p->z * -1, false, true );
5611 }
5612 return;
5613 }
5614
5615 if( m.impassable( u.pos() + *p ) || m.obstructed_by_vehicle_rotation( u.pos(), u.pos() + *p ) ) {
5616 return;
5617 }
5618
5619 peek( u.pos() + *p );
5620}
cata::optional< tripoint > choose_direction(const std::string &message, const bool allow_vertical)
Request player input of a direction, possibly including vertical component.
Definition: action.cpp:984

References _, choose_direction(), map::impassable(), look_around(), m, map::obstructed_by_vehicle_rotation(), peek(), Character::pos(), u, and vertical_move().

Referenced by handle_action(), and peek().

◆ peek() [2/2]

void game::peek ( const tripoint p)

Definition at line 5622 of file game.cpp.

5623{
5624 u.moves -= 200;
5625 tripoint prev = u.pos();
5626 u.setpos( p );
5627 tripoint center = p;
5628 const look_around_result result = look_around( /*show_window=*/true, center, center, false, false,
5629 true );
5630 u.setpos( prev );
5631
5632 if( result.peek_action && *result.peek_action == PA_BLIND_THROW ) {
5633 item_location loc;
5634 avatar_action::plthrow( u, loc, p );
5635 }
5637}

References center, map::invalidate_map_cache(), look_around(), m, Creature::moves, PA_BLIND_THROW, avatar_action::plthrow(), Character::pos(), Character::setpos(), u, and tripoint::z.

◆ perhaps_add_random_npc()

void game::perhaps_add_random_npc ( )
private

Definition at line 11011 of file game.cpp.

11012{
11013 if( !calendar::once_every( 1_hours ) ) {
11014 return;
11015 }
11016 // Create a new NPC?
11017 // Only allow NPCs on 0 z-level, otherwise they can bug out due to lack of spots
11018 if( !get_option<bool>( "RANDOM_NPC" ) || ( !m.has_zlevels() && get_levz() != 0 ) ) {
11019 return;
11020 }
11021
11022 float density = get_option<float>( "NPC_DENSITY" );
11023 static constexpr int density_search_radius = 60;
11024 const float npc_num = overmap_buffer.get_npcs_near_player( density_search_radius ).size();
11025 if( npc_num > 0.0 ) {
11026 // 100%, 80%, 64%, 52%, 41%, 33%...
11027 density *= std::pow( 0.8f, npc_num );
11028 }
11029
11030 if( !x_in_y( density, 100 ) ) {
11031 return;
11032 }
11033 bool spawn_allowed = false;
11035 int counter = 0;
11036 while( !spawn_allowed ) {
11037 if( counter >= 10 ) {
11038 return;
11039 }
11040 static constexpr int radius_spawn_range = 120;
11041 const tripoint_abs_omt u_omt = u.global_omt_location();
11042 spawn_point = u_omt + point( rng( -radius_spawn_range, radius_spawn_range ),
11043 rng( -radius_spawn_range, radius_spawn_range ) );
11044 spawn_point.z() = 0;
11045 const oter_id oter = overmap_buffer.ter( spawn_point );
11046 // shouldn't spawn on lakes or rivers.
11047 if( !is_river_or_lake( oter ) ) {
11048 spawn_allowed = true;
11049 }
11050 counter += 1;
11051 }
11052 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
11053 tmp->randomize();
11054 std::string new_fac_id = "solo_";
11055 new_fac_id += tmp->name;
11056 // create a new "lone wolf" faction for this one NPC
11057 faction *new_solo_fac = faction_manager_ptr->add_new_faction( tmp->name, faction_id( new_fac_id ),
11058 faction_id( "no_faction" ) );
11059 tmp->set_fac( new_solo_fac ? new_solo_fac->id : faction_id( "no_faction" ) );
11060 // adds the npc to the correct overmap.
11061 // Only spawn random NPCs on z-level 0
11062 // TODO: fix point types
11063 tripoint submap_spawn = omt_to_sm_copy( spawn_point.raw() );
11064 tmp->spawn_at_sm( tripoint( submap_spawn.xy(), 0 ) );
11066 tmp->form_opinion( u );
11067 tmp->mission = NPC_MISSION_NULL;
11068 tmp->long_term_goal_action();
11069 tmp->add_new_mission( mission::reserve_random( ORIGIN_ANY_NPC, tmp->global_omt_location(),
11070 tmp->getID() ) );
11071 // This will make the new NPC active- if its nearby to the player
11072 load_npcs();
11073}
faction_id id
Definition: faction.h:82
point omt_to_sm_copy(const point &p)
@ ORIGIN_ANY_NPC
Definition: mission.h:46
bool is_river_or_lake(const oter_id &ter)
Definition: overmap.cpp:563

References faction_manager_ptr, get_levz(), overmapbuffer::get_npcs_near_player(), Character::global_omt_location(), map::has_zlevels(), faction_template::id, overmapbuffer::insert_npc(), is_river_or_lake(), load_npcs(), m, NPC_MISSION_NULL, omt_to_sm_copy(), calendar::once_every(), ORIGIN_ANY_NPC, overmap_buffer, mission::reserve_random(), rng(), overmapbuffer::ter(), u, x_in_y(), and tripoint::xy().

Referenced by do_turn().

◆ phasing_move()

bool game::phasing_move ( const tripoint dest,
bool  via_ramp = false 
)

Definition at line 9412 of file game.cpp.

9413{
9414 if( dest_loc.z != u.posz() && !via_ramp ) {
9415 // No vertical phasing yet
9416 return false;
9417 }
9418
9419 //probability travel through walls but not water
9420 tripoint dest = dest_loc;
9421 // tile is impassable
9422 int tunneldist = 0;
9423 const point d( sgn( dest.x - u.posx() ), sgn( dest.y - u.posy() ) );
9424 while( m.impassable( dest ) ||
9425 ( critter_at( dest ) != nullptr && tunneldist > 0 ) ) {
9426 //add 1 to tunnel distance for each impassable tile in the line
9427 tunneldist += 1;
9428 //Being dimensionally anchored prevents quantum shenanigans.
9429 if( u.worn_with_flag( "DIMENSIONAL_ANCHOR" ) || u.has_effect_with_flag( "DIMENSIONAL_ANCHOR" ) ) {
9431 _( "You try to quantum tunnel through the barrier, but something holds you back!" ) );
9432 return false;
9433 }
9434 if( tunneldist > 24 ) {
9435 add_msg( m_info, _( "It's too dangerous to tunnel that far!" ) );
9436 return false;
9437 }
9438
9439 dest.x += d.x;
9440 dest.y += d.y;
9441 }
9442
9444
9445 if( tunneldist != 0 ) {
9446 // -1 because power_cost for the first tile was already taken up by the bionic's activation
9447 if( ( tunneldist - 1 ) * power_cost > u.get_power_level() ) {
9448 // oops, not enough energy! Tunneling costs set amount of bionic power per impassable tile
9449 if( tunneldist * power_cost > u.get_max_power_level() ) {
9450 add_msg( _( "You try to quantum tunnel through the barrier but bounce off! You don't have enough bionic power capacity to travel that far." ) );
9451 } else {
9452 add_msg( _( "You try to quantum tunnel through the barrier but are reflected! You need %s of bionic power to travel that thickness of material." ),
9453 units::display( power_cost * tunneldist ) );
9454 }
9455 return false;
9456 }
9457
9458 if( u.in_vehicle ) {
9459 m.unboard_vehicle( u.pos() );
9460 }
9461
9462 add_msg( _( "You quantum tunnel through the %d-tile wide barrier!" ), tunneldist );
9463 //tunneling costs 100 bionic power per impassable tile, but the first 100 was already drained by activation.
9464 u.mod_power_level( -( ( tunneldist - 1 ) * power_cost ) );
9465 //tunneling costs 100 moves baseline, 50 per extra tile up to a cap of 500 moves
9466 u.moves -= ( 50 + ( tunneldist * 50 ) );
9467 u.setpos( dest );
9468
9469 if( m.veh_at( u.pos() ).part_with_feature( "BOARDABLE", true ) ) {
9470 m.board_vehicle( u.pos(), &u );
9471 }
9472
9473 u.grab( OBJECT_NONE );
9475 m.creature_on_trap( u );
9476 return true;
9477 }
9478
9479 return false;
9480}
bool worn_with_flag(const std::string &flag, const bodypart_id &bp=bodypart_str_id::NULL_ID()) const
Returns true if the player is wearing an item with the given flag.
Definition: character.cpp:3231
units::energy get_max_power_level() const
Definition: character.cpp:1890
bool has_effect_with_flag(const std::string &flag, body_part bp=num_bp) const
Check if creature has any effect with the given flag.
Definition: creature.cpp:1207
void on_move_effects()
Definition: game.cpp:9680
void board_vehicle(const tripoint &p, player *pl)
Definition: map.cpp:1107
constexpr int sgn(const T x)
Definition: enums.h:8
static const bionic_id bio_probability_travel("bio_probability_travel")
std::string display(const units::energy v)
Definition: units.cpp:59
units::energy power_activate
Power cost on activation.
Definition: bionics.h:37

References _, add_msg(), player::add_msg_if_player(), bio_probability_travel, map::board_vehicle(), map::creature_on_trap(), critter_at(), units::display(), Character::get_max_power_level(), Character::get_power_level(), avatar::grab(), Creature::has_effect_with_flag(), map::impassable(), Character::in_vehicle, m, m_info, Character::mod_power_level(), Creature::moves, OBJECT_NONE, on_move_effects(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), bionic_data::power_activate, Character::setpos(), sgn(), u, map::unboard_vehicle(), map::veh_at(), Character::worn_with_flag(), point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

◆ pickup() [1/2]

void game::pickup ( )
private

Definition at line 5568 of file game.cpp.

5569{
5570 const cata::optional<tripoint> examp_ = choose_adjacent_highlight( _( "Pickup where?" ),
5571 _( "There is nothing to pick up nearby." ),
5572 ACTION_PICKUP, false );
5573 if( !examp_ ) {
5574 return;
5575 }
5576 pickup( *examp_ );
5577}

References _, ACTION_PICKUP, choose_adjacent_highlight(), and pickup().

Referenced by handle_action(), and pickup().

◆ pickup() [2/2]

void game::pickup ( const tripoint p)
private

Definition at line 5579 of file game.cpp.

5580{
5581 // Highlight target
5582 shared_ptr_fast<game::draw_callback_t> hilite_cb = make_shared_fast<game::draw_callback_t>( [&]() {
5583 m.drawsq( w_terrain, p, drawsq_params().highlight( true ) );
5584 } );
5585 add_draw_callback( hilite_cb );
5586
5587 pickup::pick_up( p, 0 );
5588}

References add_draw_callback(), map::drawsq(), m, pickup::pick_up(), and w_terrain.

◆ pickup_feet()

void game::pickup_feet ( )
private

Definition at line 5590 of file game.cpp.

5591{
5592 pickup::pick_up( u.pos(), 1 );
5593}

References pickup::pick_up(), Character::pos(), and u.

Referenced by handle_action().

◆ place_critter_around() [1/2]

monster * game::place_critter_around ( const mtype_id id,
const tripoint center,
int  radius 
)

Definition at line 4626 of file game.cpp.

4627{
4628 // TODO: change this into an assert, it must never happen.
4629 if( id.is_null() ) {
4630 return nullptr;
4631 }
4632 return place_critter_around( make_shared_fast<monster>( id ), center, radius );
4633}
monster * place_critter_around(const mtype_id &id, const tripoint &center, int radius)
Definition: game.cpp:4626

References center, and place_critter_around().

Referenced by place_critter_around(), place_critter_at(), replace_stair_monsters(), and start_game().

◆ place_critter_around() [2/2]

monster * game::place_critter_around ( const shared_ptr_fast< monster > &  mon,
const tripoint center,
int  radius,
bool  forced = false 
)

Definition at line 4635 of file game.cpp.

4639{
4641 if( forced || can_place_monster( *mon, center ) ) {
4642 where = center;
4643 }
4644
4645 // This loop ensures the monster is placed as close to the center as possible,
4646 // but all places that equally far from the center have the same probability.
4647 for( int r = 1; r <= radius && !where; ++r ) {
4649 }
4650
4651 if( !where ) {
4652 return nullptr;
4653 }
4654 mon->spawn( *where );
4655 return critter_tracker->add( mon ) ? mon.get() : nullptr;
4656}
static cata::optional< tripoint > choose_where_to_place_monster(const monster &mon, const tripoint_range< tripoint > &range)
Definition: game.cpp:4608
static bool can_place_monster(const monster &mon, const tripoint &p)
Definition: game.cpp:4592

References can_place_monster(), center, choose_where_to_place_monster(), critter_tracker, m, and map::points_in_radius().

◆ place_critter_at() [1/2]

monster * game::place_critter_at ( const mtype_id id,
const tripoint p 
)

Adds critters to the reality bubble, creating them if necessary.

Functions taking a id parameter will construct a monster based on that id, (with default properties). Functions taking a mon parameter will use the supplied monster instance instead (which must not be null). Note: the monster will not be upgraded by these functions, it is placed as is.

place_critter_at will place the creature exactly at the given point.

place_critter_around will place the creature around the center p within the given radius (radius 0 means only the center point is used). The chosen point will be as close to the center as possible.

place_critter_within will place the creature at a random point within that given range. (All points within have equal probability.)

Returns
All functions return null if the creature could not be placed (usually because the target is not suitable for it: may be a solid wall, or air, or already occupied by some creature). If the creature has been placed, it returns a pointer to it (which is the same as the one contained in mon).

Definition at line 4616 of file game.cpp.

4617{
4618 return place_critter_around( id, p, 0 );
4619}

References place_critter_around().

Referenced by fungal_effects::fungalize(), revive_corpse(), fungal_effects::spread_fungus_one_tile(), and update_stair_monsters().

◆ place_critter_at() [2/2]

monster * game::place_critter_at ( const shared_ptr_fast< monster > &  mon,
const tripoint p 
)

Definition at line 4621 of file game.cpp.

4622{
4623 return place_critter_around( mon, p, 0 );
4624}

References place_critter_around().

◆ place_critter_within() [1/2]

monster * game::place_critter_within ( const mtype_id id,
const tripoint_range< tripoint > &  range 
)

Definition at line 4658 of file game.cpp.

4659{
4660 // TODO: change this into an assert, it must never happen.
4661 if( id.is_null() ) {
4662 return nullptr;
4663 }
4664 return place_critter_within( make_shared_fast<monster>( id ), range );
4665}
monster * place_critter_within(const mtype_id &id, const tripoint_range< tripoint > &range)
Definition: game.cpp:4658

References place_critter_within().

Referenced by place_critter_within().

◆ place_critter_within() [2/2]

monster * game::place_critter_within ( const shared_ptr_fast< monster > &  mon,
const tripoint_range< tripoint > &  range 
)

Definition at line 4667 of file game.cpp.

4669{
4670 const cata::optional<tripoint> where = choose_where_to_place_monster( *mon, range );
4671 if( !where ) {
4672 return nullptr;
4673 }
4674 mon->spawn( *where );
4675 return critter_tracker->add( mon ) ? mon.get() : nullptr;
4676}

References choose_where_to_place_monster(), and critter_tracker.

◆ place_player()

point game::place_player ( const tripoint dest)
Dexterity increases chance of avoiding cuts on sharp terrain

Definition at line 9050 of file game.cpp.

9051{
9052 const optional_vpart_position vp1 = m.veh_at( dest_loc );
9053 if( const cata::optional<std::string> label = vp1.get_label() ) {
9054 add_msg( m_info, _( "Label here: %s" ), *label );
9055 }
9056 std::string signage = m.get_signage( dest_loc );
9057 if( !signage.empty() ) {
9058 if( !u.has_trait( trait_ILLITERATE ) ) {
9059 add_msg( m_info, _( "The sign says: %s" ), signage );
9060 } else {
9061 add_msg( m_info, _( "There is a sign here, but you are unable to read it." ) );
9062 }
9063 }
9064 if( m.has_graffiti_at( dest_loc ) ) {
9065 if( !u.has_trait( trait_ILLITERATE ) ) {
9066 add_msg( m_info, _( "Written here: %s" ), m.graffiti_at( dest_loc ) );
9067 } else {
9068 add_msg( m_info, _( "Something is written here, but you are unable to read it." ) );
9069 }
9070 }
9071 // TODO: Move the stuff below to a Character method so that NPCs can reuse it
9072 if( m.has_flag( "ROUGH", dest_loc ) && ( !u.in_vehicle ) && ( !u.is_mounted() ) ) {
9073 if( one_in( 5 ) && u.get_armor_bash( bodypart_id( "foot_l" ) ) < rng( 2, 5 ) ) {
9074 add_msg( m_bad, _( "You hurt your left foot on the %s!" ),
9075 m.has_flag_ter( "ROUGH", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9076 dest_loc ) );
9077 u.deal_damage( nullptr, bodypart_id( "foot_l" ), damage_instance( DT_CUT, 1 ) );
9078 }
9079 if( one_in( 5 ) && u.get_armor_bash( bodypart_id( "foot_r" ) ) < rng( 2, 5 ) ) {
9080 add_msg( m_bad, _( "You hurt your right foot on the %s!" ),
9081 m.has_flag_ter( "ROUGH", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9082 dest_loc ) );
9083 u.deal_damage( nullptr, bodypart_id( "foot_l" ), damage_instance( DT_CUT, 1 ) );
9084 }
9085 }
9086 ///\EFFECT_DEX increases chance of avoiding cuts on sharp terrain
9087 if( m.has_flag( "SHARP", dest_loc ) && !one_in( 3 ) && !x_in_y( 1 + u.dex_cur / 2.0, 40 ) &&
9088 ( !u.in_vehicle && !m.veh_at( dest_loc ) ) && ( !u.has_trait( trait_PARKOUR ) ||
9089 one_in( 4 ) ) && ( u.has_trait( trait_THICKSKIN ) ? !one_in( 8 ) : true ) ) {
9090 if( u.is_mounted() ) {
9091 add_msg( _( "Your %s gets cut!" ), u.mounted_creature->get_name() );
9092 u.mounted_creature->apply_damage( nullptr, bodypart_id( "torso" ), rng( 1, 10 ) );
9093 } else {
9094 const bodypart_id bp = u.get_random_body_part();
9095 if( u.deal_damage( nullptr, bp, damage_instance( DT_CUT, rng( 1, 10 ) ) ).total_damage() > 0 ) {
9096 //~ 1$s - bodypart name in accusative, 2$s is terrain name.
9097 add_msg( m_bad, _( "You cut your %1$s on the %2$s!" ),
9098 body_part_name_accusative( bp->token ),
9099 m.has_flag_ter( "SHARP", dest_loc ) ? m.tername( dest_loc ) : m.furnname(
9100 dest_loc ) );
9101 }
9102 }
9103 }
9104 if( m.has_flag( "UNSTABLE", dest_loc ) && !u.is_mounted() ) {
9105 u.add_effect( effect_bouldering, 1_turns, num_bp );
9106 } else if( u.has_effect( effect_bouldering ) ) {
9108 }
9109 if( m.has_flag_ter_or_furn( TFLAG_NO_SIGHT, dest_loc ) ) {
9110 u.add_effect( effect_no_sight, 1_turns, num_bp );
9111 } else if( u.has_effect( effect_no_sight ) ) {
9113 }
9114
9115 // If we moved out of the nonant, we need update our map data
9116 if( m.has_flag( "SWIMMABLE", dest_loc ) && u.has_effect( effect_onfire ) ) {
9117 add_msg( _( "The water puts out the flames!" ) );
9119 if( u.is_mounted() ) {
9120 monster *mon = u.mounted_creature.get();
9121 if( mon->has_effect( effect_onfire ) ) {
9123 }
9124 }
9125 }
9126
9127 if( monster *const mon_ptr = critter_at<monster>( dest_loc ) ) {
9128 // We displaced a monster. It's probably a bug if it wasn't a friendly mon...
9129 // Immobile monsters can't be displaced.
9130 monster &critter = *mon_ptr;
9131 // TODO: handling for ridden creatures other than players mount.
9132 if( !critter.has_effect( effect_ridden ) ) {
9133 if( u.is_mounted() ) {
9134 std::vector<tripoint> valid;
9135 for( const tripoint &jk : m.points_in_radius( critter.pos(), 1 ) ) {
9136 if( is_empty( jk ) ) {
9137 valid.push_back( jk );
9138 }
9139 }
9140 if( !valid.empty() ) {
9141 critter.move_to( random_entry( valid ) );
9142 add_msg( _( "You push the %s out of the way." ), critter.name() );
9143 } else {
9144 add_msg( _( "There is no room to push the %s out of the way." ), critter.name() );
9145 return u.pos().xy();
9146 }
9147 } else {
9148 critter.move_to( u.pos(), false,
9149 true ); // Force the movement even though the player is there right now.
9150 add_msg( _( "You displace the %s." ), critter.name() );
9151 }
9152 } else if( !u.has_effect( effect_riding ) ) {
9153 add_msg( _( "You cannot move the %s out of the way." ), critter.name() );
9154 return u.pos().xy();
9155 }
9156 }
9157
9158 // If the player is in a vehicle, unboard them from the current part
9159 if( u.in_vehicle ) {
9160 m.unboard_vehicle( u.pos() );
9161 }
9162 // Move the player
9163 // Start with z-level, to make it less likely that old functions (2D ones) freak out
9164 if( m.has_zlevels() && dest_loc.z != get_levz() ) {
9165 vertical_shift( dest_loc.z );
9166 }
9167
9168 if( u.is_hauling() && ( !m.can_put_items( dest_loc ) ||
9169 m.has_flag( TFLAG_DEEP_WATER, dest_loc ) ||
9170 vp1 ) ) {
9171 u.stop_hauling();
9172 }
9173 u.setpos( dest_loc );
9174 if( u.is_mounted() ) {
9175 monster *mon = u.mounted_creature.get();
9176 mon->setpos( dest_loc );
9177 mon->process_triggers();
9178 m.creature_in_field( *mon );
9179 }
9180 point submap_shift = update_map( u );
9181 // Important: don't use dest_loc after this line. `update_map` may have shifted the map
9182 // and dest_loc was not adjusted and therefore is still in the un-shifted system and probably wrong.
9183 // If you must use it you can calculate the position in the new, shifted system with
9184 // adjusted_pos = ( old_pos.x - submap_shift.x * SEEX, old_pos.y - submap_shift.y * SEEY, old_pos.z )
9185
9186 //Auto pulp or butcher and Auto foraging
9187 if( get_option<bool>( "AUTO_FEATURES" ) && mostseen == 0 && !u.is_mounted() ) {
9189
9190 const std::string forage_type = get_option<std::string>( "AUTO_FORAGING" );
9191 if( forage_type != "off" ) {
9192 const auto forage = [&]( const tripoint & pos ) {
9193 const auto &xter_t = m.ter( pos ).obj().examine;
9194 const auto &xfurn_t = m.furn( pos ).obj().examine;
9195 const bool forage_everything = forage_type == "both";
9196 const bool forage_bushes = forage_everything || forage_type == "bushes";
9197 const bool forage_trees = forage_everything || forage_type == "trees";
9198 if( xter_t == &iexamine::none && xfurn_t == &iexamine::none ) {
9199 return;
9200 } else if( ( forage_bushes && xter_t == &iexamine::shrub_marloss ) ||
9201 ( forage_bushes && xter_t == &iexamine::shrub_wildveggies ) ||
9202 ( forage_bushes && xter_t == &iexamine::harvest_ter_nectar ) ||
9203 ( forage_trees && xter_t == &iexamine::tree_marloss ) ||
9204 ( forage_trees && xter_t == &iexamine::harvest_ter ) ||
9205 ( forage_trees && xter_t == &iexamine::harvest_ter_nectar )
9206 ) {
9207 xter_t( u, pos );
9208 } else if( ( forage_everything && xfurn_t == &iexamine::harvest_furn ) ||
9209 ( forage_everything && xfurn_t == &iexamine::harvest_furn_nectar )
9210 ) {
9211 xfurn_t( u, pos );
9212 }
9213 };
9214
9215 for( auto &elem : adjacentDir ) {
9216 forage( u.pos() + direction_XY( elem ) );
9217 }
9218 }
9219
9220 const std::string pulp_butcher = get_option<std::string>( "AUTO_PULP_BUTCHER" );
9221 if( pulp_butcher == "butcher" && u.max_quality( quality_id( "BUTCHER" ) ) > INT_MIN ) {
9222 std::vector<item *> corpses;
9223
9224 for( item &it : m.i_at( u.pos() ) ) {
9225 corpses.push_back( &it );
9226 }
9227
9228 if( !corpses.empty() ) {
9229 u.assign_activity( activity_id( "ACT_BUTCHER" ), 0, true );
9230 for( item *it : corpses ) {
9231 u.activity.targets.emplace_back( map_cursor( u.pos() ), it );
9232 }
9233 }
9234 } else if( pulp_butcher == "pulp" || pulp_butcher == "pulp_adjacent" ) {
9235 const auto pulp = [&]( const tripoint & pos ) {
9236 for( const auto &maybe_corpse : m.i_at( pos ) ) {
9237 if( maybe_corpse.is_corpse() && maybe_corpse.can_revive() &&
9238 !maybe_corpse.get_mtype()->bloodType().obj().has_acid ) {
9240 u.activity.placement = m.getabs( pos );
9241 u.activity.auto_resume = true;
9242 u.activity.str_values.push_back( "auto_pulp_no_acid" );
9243 return;
9244 }
9245 }
9246 };
9247
9248 if( pulp_butcher == "pulp_adjacent" ) {
9249 for( auto &elem : adjacentDir ) {
9250 pulp( u.pos() + direction_XY( elem ) );
9251 }
9252 } else {
9253 pulp( u.pos() );
9254 }
9255 }
9256 }
9257
9258 //Autopickup
9259 if( !u.is_mounted() && get_option<bool>( "AUTO_PICKUP" ) && !u.is_hauling() &&
9260 ( !get_option<bool>( "AUTO_PICKUP_SAFEMODE" ) || mostseen == 0 ) &&
9261 ( m.has_items( u.pos() ) || get_option<bool>( "AUTO_PICKUP_ADJACENT" ) ) ) {
9262 pickup::pick_up( u.pos(), -1 );
9263 }
9264
9265 // If the new tile is a boardable part, board it
9266 if( vp1.part_with_feature( "BOARDABLE", true ) && !u.is_mounted() ) {
9267 m.board_vehicle( u.pos(), &u );
9268 }
9269
9270 // Traps!
9271 // Try to detect.
9273 if( u.is_mounted() ) {
9275 } else {
9276 m.creature_on_trap( u );
9277 }
9278 // Drench the player if swimmable
9279 if( m.has_flag( "SWIMMABLE", u.pos() ) &&
9280 !( u.is_mounted() || ( u.in_vehicle && vp1->vehicle().can_float() ) ) ) {
9281 u.drench( 40, { { bp_foot_l, bp_foot_r, bp_leg_l, bp_leg_r } }, false );
9282 }
9283
9284 // List items here
9285 if( !m.has_flag( "SEALED", u.pos() ) ) {
9286 if( get_option<bool>( "NO_AUTO_PICKUP_ZONES_LIST_ITEMS" ) ||
9287 !check_zone( zone_type_id( "NO_AUTO_PICKUP" ), u.pos() ) ) {
9288 if( u.is_blind() && !m.i_at( u.pos() ).empty() ) {
9289 add_msg( _( "There's something here, but you can't see what it is." ) );
9290 } else if( m.has_items( u.pos() ) ) {
9291 std::vector<std::string> names;
9292 std::vector<size_t> counts;
9293 std::vector<item> items;
9294 for( auto &tmpitem : m.i_at( u.pos() ) ) {
9295
9296 std::string next_tname = tmpitem.tname();
9297 std::string next_dname = tmpitem.display_name();
9298 bool by_charges = tmpitem.count_by_charges();
9299 bool got_it = false;
9300 for( size_t i = 0; i < names.size(); ++i ) {
9301 if( by_charges && next_tname == names[i] ) {
9302 counts[i] += tmpitem.charges;
9303 got_it = true;
9304 break;
9305 } else if( next_dname == names[i] ) {
9306 counts[i] += 1;
9307 got_it = true;
9308 break;
9309 }
9310 }
9311 if( !got_it ) {
9312 if( by_charges ) {
9313 names.push_back( tmpitem.tname( tmpitem.charges ) );
9314 counts.push_back( tmpitem.charges );
9315 } else {
9316 names.push_back( tmpitem.display_name( 1 ) );
9317 counts.push_back( 1 );
9318 }
9319 items.push_back( tmpitem );
9320 }
9321 if( names.size() > 10 ) {
9322 break;
9323 }
9324 }
9325 for( size_t i = 0; i < names.size(); ++i ) {
9326 if( !items[i].count_by_charges() ) {
9327 names[i] = items[i].display_name( counts[i] );
9328 } else {
9329 names[i] = items[i].tname( counts[i] );
9330 }
9331 }
9332 int and_the_rest = 0;
9333 for( size_t i = 0; i < names.size(); ++i ) {
9334 //~ number of items: "<number> <item>"
9335 std::string fmt = vgettext( "%1$d %2$s", "%1$d %2$s", counts[i] );
9336 names[i] = string_format( fmt, counts[i], names[i] );
9337 // Skip the first two.
9338 if( i > 1 ) {
9339 and_the_rest += counts[i];
9340 }
9341 }
9342 if( names.size() == 1 ) {
9343 add_msg( _( "You see here %s." ), names[0] );
9344 } else if( names.size() == 2 ) {
9345 add_msg( _( "You see here %s and %s." ), names[0], names[1] );
9346 } else if( names.size() == 3 ) {
9347 add_msg( _( "You see here %s, %s, and %s." ), names[0], names[1], names[2] );
9348 } else if( and_the_rest < 7 ) {
9349 add_msg( vgettext( "You see here %s, %s and %d more item.",
9350 "You see here %s, %s and %d more items.",
9351 and_the_rest ),
9352 names[0], names[1], and_the_rest );
9353 } else {
9354 add_msg( _( "You see here %s and many more items." ), names[0] );
9355 }
9356 }
9357 }
9358 }
9359
9360 if( ( vp1.part_with_feature( "CONTROL_ANIMAL", true ) ||
9361 vp1.part_with_feature( "CONTROLS", true ) ) && u.in_vehicle && !u.is_mounted() ) {
9362 add_msg( _( "There are vehicle controls here." ) );
9363 if( !u.has_trait( trait_id( "WAYFARER" ) ) ) {
9364 add_msg( m_info, _( "%s to drive." ), press_x( ACTION_CONTROL_VEHICLE ) );
9365 }
9366 } else if( vp1.part_with_feature( "CONTROLS", true ) && u.in_vehicle &&
9367 u.is_mounted() ) {
9368 add_msg( _( "There are vehicle controls here but you cannot reach them whilst mounted." ) );
9369 }
9370 return submap_shift;
9371}
std::string body_part_name_accusative(body_part bp, int number)
Returns the matching accusative name of the body_part token, i.e.
Definition: bodypart.cpp:329
void drench(int saturation, const body_part_set &flags, bool ignore_waterproof)
Drenches the player with water, saturation is the percent gotten wet.
Definition: suffer.cpp:1759
bool is_hauling() const
Definition: character.cpp:9140
void stop_hauling()
Definition: character.cpp:9131
bodypart_id get_random_body_part(bool main=false) const
Definition: creature.cpp:1626
void vertical_shift(int z_after)
Actual z-level movement part of vertical_move.
Definition: game.cpp:10534
bool check_zone(const zone_type_id &type, const tripoint &where) const
Definition: game.cpp:5983
std::string furnname(const tripoint &p)
Definition: map.cpp:1527
bool has_flag_ter_or_furn(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2380
bool has_graffiti_at(const tripoint &p) const
Definition: map.cpp:7908
bool has_items(const tripoint &p) const
Checks for existence of items.
Definition: map.cpp:4830
const std::string & graffiti_at(const tripoint &p) const
Definition: map.cpp:7897
bool has_flag_ter(const std::string &flag, const tripoint &p) const
Definition: map.cpp:2370
bool can_put_items(const tripoint &p) const
Definition: map.cpp:2356
void setpos(const tripoint &p) override
Definition: monster.cpp:238
bool move_to(const tripoint &p, bool force=false, bool step_on_critter=false, float stagger_adjustment=1.0)
Attempt to move to p.
Definition: monmove.cpp:1548
void process_triggers()
Definition: monster.cpp:1221
cata::optional< std::string > get_label() const
std::vector< std::string > str_values
bool auto_resume
If true, the activity will be auto-resumed next time the player attempts an identical activity.
static const efftype_id effect_riding("riding")
static const trait_id trait_ILLITERATE("ILLITERATE")
static const efftype_id effect_bouldering("bouldering")
static const trait_id trait_PARKOUR("PARKOUR")
static const efftype_id effect_no_sight("no_sight")
static const trait_id trait_THICKSKIN("THICKSKIN")
static const efftype_id effect_onfire("onfire")
point direction_XY(const direction dir)
Definition: line.cpp:433
@ TFLAG_NO_SIGHT
Definition: mapdata.h:283
@ TFLAG_DEEP_WATER
Definition: mapdata.h:301
static std::map< nameFlags, std::vector< std::string > > names
Definition: name.cpp:18
const int INDEFINITELY_LONG
A number that represents the longest possible action.
void search_surroundings(Character &who)
Search surrounding squares for traps (and maybe other things in the future).
void shrub_wildveggies(player &p, const tripoint &examp)
Definition: iexamine.cpp:3681
void shrub_marloss(player &p, const tripoint &examp)
Definition: iexamine.cpp:3646
void harvest_ter(player &p, const tripoint &examp)
Definition: iexamine.cpp:2118
void harvest_furn(player &p, const tripoint &examp)
Definition: iexamine.cpp:2097
void harvest_ter_nectar(player &p, const tripoint &examp)
Definition: iexamine.cpp:2106
void harvest_furn_nectar(player &p, const tripoint &examp)
Definition: iexamine.cpp:2088
void tree_marloss(player &p, const tripoint &examp)
Definition: iexamine.cpp:3660
string_id< zone_type > zone_type_id
Definition: type_id.h:199

References _, ACTION_CONTROL_VEHICLE, Character::activity, Creature::add_effect(), add_msg(), Character::assign_activity(), player_activity::auto_resume, map::board_vehicle(), body_part_name_accusative(), bp_foot_l, bp_foot_r, bp_leg_l, bp_leg_r, map::can_put_items(), check_zone(), map::creature_in_field(), map::creature_on_trap(), Character::deal_damage(), Character::dex_cur, direction_XY(), Character::drench(), DT_CUT, EAST, effect_bouldering, effect_no_sight, effect_onfire, effect_ridden, effect_riding, item_stack::empty(), map_data_common_t::examine, map::furn(), map::furnname(), Character::get_armor_bash(), optional_vpart_position::get_label(), get_levz(), Creature::get_random_body_part(), map::get_signage(), map::getabs(), map::graffiti_at(), iexamine::harvest_furn(), iexamine::harvest_furn_nectar(), iexamine::harvest_ter(), iexamine::harvest_ter_nectar(), Creature::has_effect(), map::has_flag(), map::has_flag_ter(), map::has_flag_ter_or_furn(), map::has_graffiti_at(), map::has_items(), Character::has_trait(), map::has_zlevels(), map::i_at(), Character::in_vehicle, calendar::INDEFINITELY_LONG, Character::is_blind(), is_empty(), Character::is_hauling(), Character::is_mounted(), m, m_bad, m_info, visitable< T >::max_quality(), mostseen, Character::mounted_creature, monster::move_to(), monster::name(), Name::names, iexamine::none(), NORTH, NORTHEAST, NORTHWEST, num_bp, int_id< T >::obj(), one_in(), optional_vpart_position::part_with_feature(), pickup::pick_up(), player_activity::placement, map::points_in_radius(), Character::pos(), monster::pos(), press_x(), monster::process_triggers(), random_entry(), Creature::remove_effect(), rng(), character_funcs::search_surroundings(), Character::setpos(), monster::setpos(), iexamine::shrub_marloss(), iexamine::shrub_wildveggies(), SOUTH, SOUTHEAST, SOUTHWEST, Character::stop_hauling(), player_activity::str_values, string_format(), player_activity::targets, map::ter(), map::tername(), TFLAG_DEEP_WATER, TFLAG_NO_SIGHT, trait_ILLITERATE, trait_PARKOUR, trait_THICKSKIN, iexamine::tree_marloss(), u, map::unboard_vehicle(), update_map(), map::veh_at(), vertical_shift(), vgettext(), WEST, x_in_y(), tripoint::xy(), and tripoint::z.

Referenced by place_player_overmap(), and walk_move().

◆ place_player_overmap()

void game::place_player_overmap ( const tripoint_abs_omt om_dest)

Definition at line 9373 of file game.cpp.

9374{
9375 // if player is teleporting around, they don't bring their horse with them
9376 if( u.is_mounted() ) {
9378 u.mounted_creature->remove_effect( effect_ridden );
9379 u.mounted_creature = nullptr;
9380 }
9381 // offload the active npcs.
9382 unload_npcs();
9383 for( monster &critter : all_monsters() ) {
9384 despawn_monster( critter );
9385 }
9386 if( u.in_vehicle ) {
9387 m.unboard_vehicle( u.pos() );
9388 }
9389
9391 const int minz = m.has_zlevels() ? -OVERMAP_DEPTH : get_levz();
9392 const int maxz = m.has_zlevels() ? OVERMAP_HEIGHT : get_levz();
9393 for( int z = minz; z <= maxz; z++ ) {
9394 m.clear_vehicle_list( z );
9395 }
9397 // offset because load_map expects the coordinates of the top left corner, but the
9398 // player will be centered in the middle of the map.
9399 // TODO: fix point types
9400 const tripoint map_sm_pos(
9401 project_to<coords::sm>( om_dest ).raw() + point( -HALF_MAPSIZE, -HALF_MAPSIZE ) );
9402 const tripoint player_pos( u.pos().xy(), map_sm_pos.z );
9403 load_map( map_sm_pos );
9404 load_npcs();
9405 m.spawn_monsters( true ); // Static monsters
9407 // update weather now as it could be different on the new location
9409 place_player( player_pos );
9410}
point place_player(const tripoint &dest)
Definition: game.cpp:9050
void unload_npcs()
Unloads all NPCs.
Definition: game.cpp:859
void update_overmap_seen()
Definition: game.cpp:10712
level_cache & access_cache(int zlev)
Definition: map.cpp:8807
void clear_vehicle_list(int zlev)
Definition: map.cpp:389
void clear_vehicle_cache()
Definition: map.cpp:371
std::bitset< MAPSIZE_X *MAPSIZE_Y > map_memory_seen_cache
Definition: map.h:351

References map::access_cache(), all_monsters(), map::clear_vehicle_cache(), map::clear_vehicle_list(), despawn_monster(), effect_ridden, effect_riding, get_levz(), get_weather, HALF_MAPSIZE, map::has_zlevels(), Character::in_vehicle, Character::is_mounted(), load_map(), load_npcs(), m, level_cache::map_memory_seen_cache, Character::mounted_creature, weather_manager::nextweather, OVERMAP_DEPTH, OVERMAP_HEIGHT, place_player(), Character::pos(), Creature::remove_effect(), map::spawn_monsters(), calendar::turn, u, map::unboard_vehicle(), unload_npcs(), update_overmap_seen(), tripoint::xy(), and tripoint::z.

◆ place_vehicle_nearby()

vehicle * game::place_vehicle_nearby ( const vproto_id id,
const point_abs_omt origin,
int  min_distance,
int  max_distance,
const std::vector< std::string > &  omt_search_types = {} 
)
private

Definition at line 755 of file game.cpp.

758{
759 std::vector<std::string> search_types = omt_search_types;
760 if( search_types.empty() ) {
761 vehicle veh( id );
762 if( veh.can_float() ) {
763 search_types.push_back( "river" );
764 search_types.push_back( "lake" );
765 } else {
766 search_types.push_back( "field" );
767 search_types.push_back( "road" );
768 }
769 }
770 for( const std::string &search_type : search_types ) {
771 omt_find_params find_params;
772 find_params.must_see = false;
773 find_params.cant_see = false;
774 find_params.types.emplace_back( search_type, ot_match_type::type );
775 // find nearest road
776 find_params.min_distance = min_distance;
777 find_params.search_range = max_distance;
778 // if player spawns underground, park their car on the surface.
779 const tripoint_abs_omt omt_origin( origin, 0 );
780 for( const tripoint_abs_omt &goal : overmap_buffer.find_all( omt_origin, find_params ) ) {
781 // try place vehicle there.
782 tinymap target_map;
783 target_map.load( project_to<coords::sm>( goal ), false );
784 const tripoint tinymap_center( SEEX, SEEY, goal.z() );
785 static constexpr std::array<units::angle, 4> angles = {{
786 0_degrees, 90_degrees, 180_degrees, 270_degrees
787 }
788 };
789 vehicle *veh = target_map.add_vehicle(
790 id, tinymap_center, random_entry( angles ), rng( 50, 80 ), 0, false );
791 if( veh ) {
792 tripoint abs_local = m.getlocal( target_map.getabs( tinymap_center ) );
793 veh->sm_pos = ms_to_sm_remain( abs_local );
794 veh->pos = abs_local.xy();
796 veh->tracking_on = true;
797 target_map.save();
798 return veh;
799 }
800 }
801 }
802 return nullptr;
803}
void save()
Add currently loaded submaps (in grid) to the mapbuffer.
Definition: map.cpp:6668
vehicle * add_vehicle(const vgroup_id &type, const tripoint &p, units::angle dir, int init_veh_fuel=-1, int init_veh_status=-1, bool merge_wrecks=true)
Definition: mapgen.cpp:5630
void add_vehicle(vehicle *veh)
Add the vehicle to be tracked in the overmap.
std::vector< tripoint_abs_omt > find_all(const tripoint_abs_omt &origin, const omt_find_params &params)
Find all places with the specific overmap terrain type.
Definition: map.h:2048
point pos
Position of the vehicle inside the submap that contains the vehicle.
Definition: vehicle.h:1941
tripoint sm_pos
Submap coordinates of the currently loaded submap (see game::m) that contains this vehicle.
Definition: vehicle.h:1926
bool tracking_on
Definition: vehicle.h:2016
point ms_to_sm_remain(int &x, int &y)
static constexpr int SEEY
Standard arguments for finding overmap terrain.
std::vector< std::pair< std::string, ot_match_type > > types

References map::add_vehicle(), overmapbuffer::add_vehicle(), vehicle::can_float(), omt_find_params::cant_see, overmapbuffer::find_all(), map::getabs(), map::getlocal(), map::load(), m, omt_find_params::min_distance, ms_to_sm_remain(), omt_find_params::must_see, overmap_buffer, vehicle::pos, random_entry(), rng(), map::save(), omt_find_params::search_range, SEEX, SEEY, vehicle::sm_pos, vehicle::tracking_on, type, omt_find_params::types, and tripoint::xy().

Referenced by start_game().

◆ pre_print_all_tile_info()

void game::pre_print_all_tile_info ( const tripoint lp,
const catacurses::window w_info,
int &  line,
int  last_line,
const visibility_variables cache 
)

Definition at line 6525 of file game.cpp.

6528{
6529 // get global area info according to look_around caret position
6530 // TODO: fix point types
6532 lp ) ) ) );
6533 // we only need the area name and then pass it to print_all_tile_info() function below
6534 const std::string area_name = cur_ter_m->get_name();
6535 print_all_tile_info( lp, w_info, area_name, 1, first_line, last_line, cache );
6536}
void print_all_tile_info(const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line, int last_line, const visibility_variables &cache)
Definition: game.cpp:5700
point ms_to_omt_copy(const point &p)
coords::coord_point< tripoint, coords::origin::abs, coords::omt > tripoint_abs_omt
Definition: coordinates.h:493
std::string get_name() const
Definition: omdata.h:205

References oter_t::get_name(), map::getabs(), m, ms_to_omt_copy(), overmap_buffer, print_all_tile_info(), and overmapbuffer::ter().

Referenced by look_around().

◆ print_all_tile_info()

void game::print_all_tile_info ( const tripoint lp,
const catacurses::window w_look,
const std::string &  area_name,
int  column,
int &  line,
int  last_line,
const visibility_variables cache 
)

Definition at line 5700 of file game.cpp.

5705{
5706 visibility_type visibility = VIS_HIDDEN;
5707 const bool inbounds = m.inbounds( lp );
5708 if( inbounds ) {
5709 visibility = m.get_visibility( m.apparent_light_at( lp, cache ), cache );
5710 }
5711 const Creature *creature = critter_at( lp, true );
5712 switch( visibility ) {
5713 case VIS_CLEAR: {
5714 const optional_vpart_position vp = m.veh_at( lp );
5715 print_terrain_info( lp, w_look, area_name, column, line );
5716 print_fields_info( lp, w_look, column, line );
5717 print_trap_info( lp, w_look, column, line );
5718 print_creature_info( creature, w_look, column, line, last_line );
5719 print_vehicle_info( veh_pointer_or_null( vp ), vp ? vp->part_index() : -1, w_look, column, line,
5720 last_line );
5721 print_items_info( lp, w_look, column, line, last_line );
5722 print_graffiti_info( lp, w_look, column, line, last_line );
5723 }
5724 break;
5725 case VIS_BOOMER:
5726 case VIS_BOOMER_DARK:
5727 case VIS_DARK:
5728 case VIS_LIT:
5729 case VIS_HIDDEN:
5730 print_visibility_info( w_look, column, line, visibility );
5731
5732 if( creature != nullptr ) {
5733 std::vector<std::string> buf;
5734 if( u.sees_with_infrared( *creature ) ) {
5735 creature->describe_infrared( buf );
5736 } else if( u.sees_with_specials( *creature ) ) {
5737 creature->describe_specials( buf );
5738 }
5739 for( const std::string &s : buf ) {
5740 mvwprintw( w_look, point( 1, ++line ), s );
5741 }
5742 }
5743 break;
5744 }
5745 if( !inbounds ) {
5746 return;
5747 }
5748 auto this_sound = sounds::sound_at( lp );
5749 if( !this_sound.empty() ) {
5750 mvwprintw( w_look, point( 1, ++line ), _( "You heard %s from here." ), this_sound );
5751 } else {
5752 // Check other z-levels
5753 tripoint tmp = lp;
5754 for( tmp.z = -OVERMAP_DEPTH; tmp.z <= OVERMAP_HEIGHT; tmp.z++ ) {
5755 if( tmp.z == lp.z ) {
5756 continue;
5757 }
5758
5759 auto zlev_sound = sounds::sound_at( tmp );
5760 if( !zlev_sound.empty() ) {
5761 mvwprintw( w_look, point( 1, ++line ), tmp.z > lp.z ?
5762 _( "You heard %s from above." ) : _( "You heard %s from below." ), zlev_sound );
5763 }
5764 }
5765 }
5766}
bool sees_with_specials(const Creature &critter) const
Definition: character.cpp:6320
bool sees_with_infrared(const Creature &critter) const
Check whether the this player can see the other creature with infrared.
void print_fields_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line)
Definition: game.cpp:5873
void print_terrain_info(const tripoint &lp, const catacurses::window &w_look, const std::string &area_name, int column, int &line)
Definition: game.cpp:5797
void print_graffiti_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5967
void print_creature_info(const Creature *creature, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5911
void print_vehicle_info(const vehicle *veh, int veh_part, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5920
void print_items_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line, int last_line)
Definition: game.cpp:5929
void print_visibility_info(const catacurses::window &w_look, int column, int &line, visibility_type visibility)
Definition: game.cpp:5768
void print_trap_info(const tripoint &lp, const catacurses::window &w_look, int column, int &line)
Definition: game.cpp:5891
void line(map *m, const ter_id &type, const point &p1, const point &p2)
Definition: mapgen.cpp:6485
std::string sound_at(const tripoint &location)
Definition: sounds.cpp:605

References _, map::apparent_light_at(), creature, critter_at(), map::get_visibility(), map::inbounds(), line(), m, catacurses::mvwprintw(), OVERMAP_DEPTH, OVERMAP_HEIGHT, print_creature_info(), print_fields_info(), print_graffiti_info(), print_items_info(), print_terrain_info(), print_trap_info(), print_vehicle_info(), print_visibility_info(), Character::sees_with_infrared(), Character::sees_with_specials(), sounds::sound_at(), u, map::veh_at(), veh_pointer_or_null(), VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, VIS_LIT, and tripoint::z.

Referenced by pre_print_all_tile_info().

◆ print_creature_info()

void game::print_creature_info ( const Creature creature,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5911 of file game.cpp.

5913{
5914 int vLines = last_line - line;
5915 if( creature != nullptr && ( u.sees( *creature ) || creature == &u ) ) {
5916 line = creature->print_info( w_look, ++line, vLines, column );
5917 }
5918}

References creature, line(), Character::sees(), and u.

Referenced by print_all_tile_info().

◆ print_fields_info()

void game::print_fields_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line 
)
private

Definition at line 5873 of file game.cpp.

5875{
5876 const field &tmpfield = m.field_at( lp );
5877 for( auto &fld : tmpfield ) {
5878 const field_entry &cur = fld.second;
5879 if( fld.first.obj().has_fire && ( m.has_flag( TFLAG_FIRE_CONTAINER, lp ) ||
5880 m.ter( lp ) == t_pit_shallow || m.ter( lp ) == t_pit ) ) {
5881 const int max_width = getmaxx( w_look ) - column - 2;
5882 int lines = fold_and_print( w_look, point( column, ++line ), max_width, cur.color(),
5883 get_fire_fuel_string( lp ) ) - 1;
5884 line += lines;
5885 } else {
5886 mvwprintz( w_look, point( column, ++line ), cur.color(), cur.name() );
5887 }
5888 }
5889}
An active or passive effect existing on a tile.
Definition: field.h:20
nc_color color() const
Definition: field.cpp:94
std::string name() const
Definition: field.h:84
A variable sized collection of field entries on a given map square.
Definition: field.h:131
ter_id t_pit_shallow
Definition: mapdata.cpp:627
ter_id t_pit
Definition: mapdata.cpp:627

References field_entry::color(), map::field_at(), fold_and_print(), get_fire_fuel_string(), catacurses::getmaxx(), map::has_flag(), line(), m, mvwprintz(), field_entry::name(), t_pit, t_pit_shallow, map::ter(), and TFLAG_FIRE_CONTAINER.

Referenced by print_all_tile_info().

◆ print_graffiti_info()

void game::print_graffiti_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5967 of file game.cpp.

5970{
5971 if( line > last_line ) {
5972 return;
5973 }
5974
5975 const int max_width = getmaxx( w_look ) - column - 2;
5976 if( m.has_graffiti_at( lp ) ) {
5977 fold_and_print( w_look, point( column, ++line ), max_width, c_light_gray,
5978 m.ter( lp ) == t_grave_new ? _( "Graffiti: %s" ) : _( "Inscription: %s" ),
5979 m.graffiti_at( lp ) );
5980 }
5981}
ter_id t_grave_new
Definition: mapdata.cpp:627

References _, c_light_gray, fold_and_print(), catacurses::getmaxx(), map::graffiti_at(), map::has_graffiti_at(), line(), m, t_grave_new, and map::ter().

Referenced by print_all_tile_info().

◆ print_items_info()

void game::print_items_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5929 of file game.cpp.

5933{
5934 if( !m.sees_some_items( lp, u ) ) {
5935 return;
5936 } else if( m.has_flag( "CONTAINER", lp ) && !m.could_see_items( lp, u ) ) {
5937 mvwprintw( w_look, point( column, ++line ), _( "You cannot see what is inside of it." ) );
5938 } else if( u.has_effect( effect_blind ) || u.worn_with_flag( "BLIND" ) ) {
5939 mvwprintz( w_look, point( column, ++line ), c_yellow,
5940 _( "There's something there, but you can't see what it is." ) );
5941 return;
5942 } else {
5943 std::map<std::string, int> item_names;
5944 for( auto &item : m.i_at( lp ) ) {
5945 ++item_names[item.tname()];
5946 }
5947
5948 const int max_width = getmaxx( w_look ) - column - 1;
5949 for( auto it = item_names.begin(); it != item_names.end(); ++it ) {
5950 // last line but not last item
5951 if( line + 1 >= last_line && std::next( it ) != item_names.end() ) {
5952 mvwprintz( w_look, point( column, ++line ), c_yellow, _( "More items here…" ) );
5953 break;
5954 }
5955
5956 if( it->second > 1 ) {
5957 trim_and_print( w_look, point( column, ++line ), max_width, c_white,
5958 pgettext( "%s is the name of the item. %d is the quantity of that item.", "%s [%d]" ),
5959 it->first.c_str(), it->second );
5960 } else {
5961 trim_and_print( w_look, point( column, ++line ), max_width, c_white, it->first );
5962 }
5963 }
5964 }
5965}
bool could_see_items(const tripoint &p, const Creature &who) const
Check if the creature could see items at p if there were any items.
Definition: map.cpp:4806
static const efftype_id effect_blind("blind")

References _, c_white, c_yellow, map::could_see_items(), effect_blind, catacurses::getmaxx(), Creature::has_effect(), map::has_flag(), map::i_at(), line(), m, catacurses::mvwprintw(), mvwprintz(), pgettext(), map::sees_some_items(), item::tname(), trim_and_print(), u, and Character::worn_with_flag().

Referenced by print_all_tile_info().

◆ print_terrain_info()

void game::print_terrain_info ( const tripoint lp,
const catacurses::window w_look,
const std::string &  area_name,
int  column,
int &  line 
)
private

Definition at line 5797 of file game.cpp.

5800{
5801 const int max_width = getmaxx( w_look ) - column - 1;
5802 int lines;
5803
5804 const auto fmt_tile_info = []( const tripoint & lp ) {
5805 map &here = get_map();
5806 std::string ret;
5807 if( debug_mode ) {
5808 ret += lp.to_string();
5809 ret += "\n";
5810 }
5811 ret += here.tername( lp );
5813 ret += colorize( string_format( " [%s]", here.ter( lp )->id ), c_light_blue );
5814 }
5815 if( here.has_furn( lp ) ) {
5816 ret += string_format( "; %s", here.furnname( lp ) );
5818 ret += colorize( string_format( " [%s]", here.furn( lp )->id ), c_light_blue );
5819 }
5820 }
5821 return ret;
5822 };
5823
5824 std::string tile = string_format( "(%s) %s", area_name, fmt_tile_info( lp ) );
5825
5826 if( m.impassable( lp ) ) {
5827 lines = fold_and_print( w_look, point( column, line ), max_width, c_light_gray,
5828 _( "%s; Impassable" ),
5829 tile );
5830 } else {
5831 lines = fold_and_print( w_look, point( column, line ), max_width, c_light_gray,
5832 _( "%s; Movement cost %d" ),
5833 tile, m.move_cost( lp ) * 50 );
5834
5835 const auto ll = get_light_level( std::max( 1.0,
5836 LIGHT_AMBIENT_LIT - m.ambient_light_at( lp ) + 1.0 ) );
5837 mvwprintw( w_look, point( column, ++lines ), _( "Lighting: " ) );
5838 wprintz( w_look, ll.second, ll.first );
5839 }
5840
5841 std::string signage = m.get_signage( lp );
5842 if( !signage.empty() ) {
5843 trim_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5844 // NOLINTNEXTLINE(cata-text-style): the question mark does not end a sentence
5845 u.has_trait( trait_ILLITERATE ) ? _( "Sign: ???" ) : _( "Sign: %s" ), signage );
5846 }
5847
5848 if( m.has_zlevels() && lp.z > -OVERMAP_DEPTH && !m.has_floor( lp ) ) {
5849 // Print info about stuff below
5850 tripoint below( lp.xy(), lp.z - 1 );
5851 std::string tile_below = fmt_tile_info( below );
5852
5853 if( !m.has_floor_or_support( lp ) ) {
5854 fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5855 _( "Below: %s; No support" ),
5856 tile_below );
5857 } else {
5858 fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5859 _( "Below: %s; Walkable" ),
5860 tile_below );
5861 }
5862 }
5863
5864 int map_features = fold_and_print( w_look, point( column, ++lines ), max_width, c_dark_gray,
5865 m.features( lp ) );
5866 fold_and_print( w_look, point( column, ++lines ), max_width, c_light_gray, _( "Coverage: %d%%" ),
5867 m.coverage( lp ) );
5868 if( line < lines ) {
5869 line = lines + map_features - 1;
5870 }
5871}
Manage and cache data about a part of the map.
Definition: map.h:384
bool has_floor_or_support(const tripoint &p) const
Definition: map.cpp:2097
float ambient_light_at(const tripoint &p) const
Definition: lightmap.cpp:646
std::string features(const tripoint &p)
Definition: map.cpp:1772
int coverage(const tripoint &p) const
Returns coverage value of the tile.
Definition: map.cpp:6317
static constexpr float LIGHT_AMBIENT_LIT
Definition: lightmap.h:18
std::pair< std::string, nc_color > get_light_level(const float light)
Definition: output.cpp:1621
furn_str_id id
Definition: mapdata.h:500
ter_str_id id
Definition: mapdata.h:465

References _, map::ambient_light_at(), c_dark_gray, c_light_blue, c_light_gray, colorize(), map::coverage(), debug_mode, display_object_ids, map::features(), fold_and_print(), map::furn(), map::furnname(), get_light_level(), get_map, map::get_signage(), catacurses::getmaxx(), map::has_floor(), map::has_floor_or_support(), map::has_furn(), Character::has_trait(), map::has_zlevels(), ter_t::id, furn_t::id, map::impassable(), LIGHT_AMBIENT_LIT, line(), m, map::move_cost(), catacurses::mvwprintw(), OVERMAP_DEPTH, cata::hash64_detail::ret, string_format(), map::ter(), map::tername(), tripoint::to_string(), trait_ILLITERATE, trim_and_print(), u, wprintz(), tripoint::xy(), and tripoint::z.

Referenced by print_all_tile_info().

◆ print_trap_info()

void game::print_trap_info ( const tripoint lp,
const catacurses::window w_look,
int  column,
int &  line 
)
private

Definition at line 5891 of file game.cpp.

5894{
5895 const trap &tr = m.tr_at( lp );
5896 if( tr.can_see( lp, u ) ) {
5897 partial_con *pc = m.partial_con_at( lp );
5898 std::string tr_name;
5899 if( pc && tr.loadid == tr_unfinished_construction ) {
5900 const construction &built = pc->id.obj();
5901 tr_name = string_format( _( "Unfinished task: %s, %d%% complete" ), built.group->name(),
5902 pc->counter / 100000 );
5903 } else {
5904 tr_name = tr.name();
5905 }
5906
5907 mvwprintz( w_look, point( column, ++line ), tr.color, tr_name );
5908 }
5909}
partial_con * partial_con_at(const tripoint &p)
Definition: map.cpp:5214
static const trap_str_id tr_unfinished_construction("tr_unfinished_construction")
std::string name() const
construction_group_str_id group
Definition: construction.h:50
construction_id id
nc_color color
Definition: trap.h:93

References _, trap::can_see(), trap::color, partial_con::counter, construction::group, partial_con::id, line(), trap::loadid, m, mvwprintz(), construction_group::name(), trap::name(), int_id< T >::obj(), map::partial_con_at(), string_format(), map::tr_at(), tr_unfinished_construction, and u.

Referenced by print_all_tile_info().

◆ print_vehicle_info()

void game::print_vehicle_info ( const vehicle veh,
int  veh_part,
const catacurses::window w_look,
int  column,
int &  line,
int  last_line 
)
private

Definition at line 5920 of file game.cpp.

5922{
5923 if( veh ) {
5924 mvwprintw( w_look, point( column, ++line ), _( "There is a %s there. Parts:" ), veh->name );
5925 line = veh->print_part_list( w_look, ++line, last_line, getmaxx( w_look ), veh_part );
5926 }
5927}
int print_part_list(const catacurses::window &win, int y1, int max_y, int width, int p, int hl=-1, bool detail=false) const
Prints a list of all parts to the screen inside of a boxed window, possibly highlighting a selected o...

References _, catacurses::getmaxx(), line(), catacurses::mvwprintw(), vehicle::name, and vehicle::print_part_list().

Referenced by print_all_tile_info().

◆ print_visibility_info()

void game::print_visibility_info ( const catacurses::window w_look,
int  column,
int &  line,
visibility_type  visibility 
)
private

Definition at line 5768 of file game.cpp.

5770{
5771 const char *visibility_message = nullptr;
5772 switch( visibility ) {
5773 case VIS_CLEAR:
5774 visibility_message = _( "Clearly visible." );
5775 break;
5776 case VIS_BOOMER:
5777 visibility_message = _( "A bright pink blur." );
5778 break;
5779 case VIS_BOOMER_DARK:
5780 visibility_message = _( "A pink blur." );
5781 break;
5782 case VIS_DARK:
5783 visibility_message = _( "Darkness." );
5784 break;
5785 case VIS_LIT:
5786 visibility_message = _( "Bright light." );
5787 break;
5788 case VIS_HIDDEN:
5789 visibility_message = _( "Unseen." );
5790 break;
5791 }
5792
5793 mvwprintw( w_look, point( line, column ), visibility_message );
5794 line += 2;
5795}

References _, line(), catacurses::mvwprintw(), VIS_BOOMER, VIS_BOOMER_DARK, VIS_CLEAR, VIS_DARK, VIS_HIDDEN, and VIS_LIT.

Referenced by print_all_tile_info().

◆ process_activity()

void game::process_activity ( )
private

Definition at line 1650 of file game.cpp.

1651{
1652 if( !u.activity ) {
1653 return;
1654 }
1655
1656 while( u.moves > 0 && u.activity ) {
1657 u.activity.do_turn( u );
1658 }
1659}
void do_turn(player &p)
Performs the activity for a single turn.

References Character::activity, player_activity::do_turn(), Creature::moves, and u.

Referenced by do_turn().

◆ process_artifact()

void game::process_artifact ( item it,
player p 
)

Definition at line 11284 of file game.cpp.

11285{
11286 const bool worn = p.is_worn( it );
11287 const bool wielded = ( &it == &p.weapon );
11288 std::vector<art_effect_passive> effects = it.type->artifact->effects_carried;
11289 if( worn ) {
11290 const std::vector<art_effect_passive> &ew = it.type->artifact->effects_worn;
11291 effects.insert( effects.end(), ew.begin(), ew.end() );
11292 }
11293 if( wielded ) {
11294 const std::vector<art_effect_passive> &ew = it.type->artifact->effects_wielded;
11295 effects.insert( effects.end(), ew.begin(), ew.end() );
11296 }
11297
11298 if( it.is_tool() ) {
11299 // Recharge it if necessary
11300 if( it.ammo_remaining() < it.ammo_capacity() && calendar::once_every( 1_minutes ) ) {
11301 //Before incrementing charge, check that any extra requirements are met
11302 if( check_art_charge_req( it ) ) {
11303 switch( it.type->artifact->charge_type ) {
11304 case ARTC_NULL:
11305 case NUM_ARTCS:
11306 break; // dummy entries
11307 case ARTC_TIME:
11308 // Once per hour
11309 if( calendar::once_every( 1_hours ) ) {
11310 it.charges++;
11311 }
11312 break;
11313 case ARTC_SOLAR:
11314 if( calendar::once_every( 10_minutes ) &&
11315 is_in_sunlight( p.pos() ) ) {
11316 it.charges++;
11317 }
11318 break;
11319 // Artifacts can inflict pain even on Deadened folks.
11320 // Some weird Lovecraftian thing. ;P
11321 // (So DON'T route them through mod_pain!)
11322 case ARTC_PAIN:
11323 if( calendar::once_every( 1_minutes ) ) {
11324 add_msg( m_bad, _( "You suddenly feel sharp pain for no reason." ) );
11325 p.mod_pain_noresist( 3 * rng( 1, 3 ) );
11326 it.charges++;
11327 }
11328 break;
11329 case ARTC_HP:
11330 if( calendar::once_every( 1_minutes ) ) {
11331 add_msg( m_bad, _( "You feel your body decaying." ) );
11332 p.hurtall( 1, nullptr );
11333 it.charges++;
11334 }
11335 break;
11336 case ARTC_FATIGUE:
11337 if( calendar::once_every( 1_minutes ) ) {
11338 add_msg( m_bad, _( "You feel fatigue seeping into your body." ) );
11339 u.mod_fatigue( 3 * rng( 1, 3 ) );
11340 u.mod_stamina( -90 * rng( 1, 3 ) * rng( 1, 3 ) * rng( 2, 3 ) );
11341 it.charges++;
11342 }
11343 break;
11344 // Portals are energetic enough to charge the item.
11345 // Tears in reality are consumed too, but can't charge it.
11346 case ARTC_PORTAL:
11347 for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) {
11348 m.remove_field( dest, fd_fatigue );
11349 if( m.tr_at( dest ).loadid == tr_portal ) {
11350 add_msg( m_good, _( "The portal collapses!" ) );
11351 m.remove_trap( dest );
11352 it.charges++;
11353 break;
11354 }
11355 }
11356 break;
11357 }
11358 }
11359 }
11360 }
11361
11362 for( const art_effect_passive &i : effects ) {
11363 switch( i ) {
11364 case AEP_STR_UP:
11365 p.mod_str_bonus( +4 );
11366 break;
11367 case AEP_DEX_UP:
11368 p.mod_dex_bonus( +4 );
11369 break;
11370 case AEP_PER_UP:
11371 p.mod_per_bonus( +4 );
11372 break;
11373 case AEP_INT_UP:
11374 p.mod_int_bonus( +4 );
11375 break;
11376 case AEP_ALL_UP:
11377 p.mod_str_bonus( +2 );
11378 p.mod_dex_bonus( +2 );
11379 p.mod_per_bonus( +2 );
11380 p.mod_int_bonus( +2 );
11381 break;
11382 case AEP_SPEED_UP:
11383 // Handled in player::current_speed()
11384 break;
11385
11386 case AEP_PBLUE:
11387 if( p.get_rad() > 0 ) {
11388 p.mod_rad( -1 );
11389 }
11390 break;
11391
11392 case AEP_SMOKE:
11393 if( one_in( 10 ) ) {
11394 tripoint pt( p.posx() + rng( -1, 1 ),
11395 p.posy() + rng( -1, 1 ),
11396 p.posz() );
11397 m.add_field( pt, fd_smoke, rng( 1, 3 ) );
11398 }
11399 break;
11400
11401 case AEP_SNAKES:
11402 break; // Handled in player::hit()
11403
11404 case AEP_EXTINGUISH:
11405 for( const tripoint &dest : m.points_in_radius( p.pos(), 1 ) ) {
11406 m.mod_field_age( dest, fd_fire, -1_turns );
11407 }
11408 break;
11409
11410 case AEP_FUN:
11411 //Bonus fluctuates, wavering between 0 and 30-ish - usually around 12
11412 p.add_morale( MORALE_FEELING_GOOD, rng( 1, 2 ) * rng( 2, 3 ), 0, 3_turns, 0_turns, false );
11413 break;
11414
11415 case AEP_HUNGER:
11416 if( one_in( 100 ) ) {
11417 p.mod_stored_kcal( -10 );
11418 }
11419 break;
11420
11421 case AEP_THIRST:
11422 if( one_in( 120 ) ) {
11423 p.mod_thirst( 1 );
11424 }
11425 break;
11426
11427 case AEP_EVIL:
11428 if( one_in( 150 ) ) { // Once every 15 minutes, on average
11429 p.add_effect( effect_evil, 30_minutes );
11430 if( it.is_armor() ) {
11431 if( !worn ) {
11432 add_msg( _( "You have an urge to wear the %s." ),
11433 it.tname() );
11434 }
11435 } else if( !wielded ) {
11436 add_msg( _( "You have an urge to wield the %s." ),
11437 it.tname() );
11438 }
11439 }
11440 break;
11441
11442 case AEP_SCHIZO:
11443 break; // Handled in player::suffer()
11444
11445 case AEP_RADIOACTIVE:
11446 if( one_in( 4 ) ) {
11447 p.irradiate( 1.0f );
11448 }
11449 break;
11450
11451 case AEP_STR_DOWN:
11452 p.mod_str_bonus( -3 );
11453 break;
11454
11455 case AEP_DEX_DOWN:
11456 p.mod_dex_bonus( -3 );
11457 break;
11458
11459 case AEP_PER_DOWN:
11460 p.mod_per_bonus( -3 );
11461 break;
11462
11463 case AEP_INT_DOWN:
11464 p.mod_int_bonus( -3 );
11465 break;
11466
11467 case AEP_ALL_DOWN:
11468 p.mod_str_bonus( -2 );
11469 p.mod_dex_bonus( -2 );
11470 p.mod_per_bonus( -2 );
11471 p.mod_int_bonus( -2 );
11472 break;
11473
11474 case AEP_SPEED_DOWN:
11475 break; // Handled in player::current_speed()
11476
11477 default:
11478 //Suppress warnings
11479 break;
11480 }
11481 }
11482 // Recalculate, as it might have changed (by mod_*_bonus above)
11483 p.str_cur = p.get_str();
11484 p.int_cur = p.get_int();
11485 p.dex_cur = p.get_dex();
11486 p.per_cur = p.get_per();
11487}
@ ARTC_PORTAL
Definition: artifact.h:69
@ ARTC_FATIGUE
Definition: artifact.h:68
@ ARTC_NULL
Definition: artifact.h:63
@ ARTC_SOLAR
Definition: artifact.h:65
@ NUM_ARTCS
Definition: artifact.h:70
@ ARTC_HP
Definition: artifact.h:67
@ ARTC_TIME
Definition: artifact.h:64
@ ARTC_PAIN
Definition: artifact.h:66
virtual void mod_per_bonus(int nper)
Definition: character.cpp:4172
virtual void mod_dex_bonus(int ndex)
Definition: character.cpp:4167
int str_cur
Definition: character.h:256
void mod_rad(int mod)
Definition: character.cpp:7040
virtual int get_dex() const
Definition: character.cpp:4056
virtual void mod_stored_kcal(int nkcal)
Modifiers for need values exclusive to characters.
Definition: character.cpp:4287
bool is_worn(const item &thing) const
Definition: character.h:1086
virtual int get_int() const
Definition: character.cpp:4064
virtual void mod_fatigue(int nfatigue)
Definition: character.cpp:4418
virtual void mod_str_bonus(int nstr)
Definition: character.cpp:4162
int int_cur
Definition: character.h:258
int get_rad() const
Definition: character.cpp:7030
void add_morale(const morale_type &type, int bonus, int max_bonus=0, const time_duration &duration=1_hours, const time_duration &decay_start=30_minutes, bool capped=false, const itype *item_type=nullptr)
Definition: character.cpp:9047
virtual int get_per() const
Definition: character.cpp:4060
void mod_stamina(int mod)
Definition: character.cpp:7069
void hurtall(int dam, Creature *source, bool disturb=true)
Hurts all body parts for dam, no armor reduction.
Definition: character.cpp:8617
bool irradiate(float rads, bool bypass=false)
Handles mitigation and application of radiation.
Definition: suffer.cpp:1536
virtual void mod_int_bonus(int nint)
Definition: character.cpp:4177
virtual void mod_pain_noresist(int npain)
Definition: creature.cpp:1358
bool is_in_sunlight(const tripoint &p)
Returns true if p is outdoors and it is sunny.
Definition: game.cpp:4808
bool is_tool() const
Definition: item.cpp:6958
int charges
Definition: item.h:2196
bool is_armor() const
Definition: item.cpp:6709
bool add_field(const tripoint &p, const field_type_id &type_id, int intensity=INT_MAX, const time_duration &age=0_turns, bool hit_player=true)
Add field entry at point, or set intensity if present.
Definition: map.cpp:5469
time_duration mod_field_age(const tripoint &p, const field_type_id &type, const time_duration &offset)
Increment/decrement age of field entry at point.
Definition: map.cpp:5389
void remove_trap(const tripoint &p)
Definition: map.cpp:5334
art_effect_passive
Definition: enums.h:99
@ AEP_EXTINGUISH
Definition: enums.h:114
field_type_id fd_smoke
Definition: field_type.cpp:346
field_type_id fd_fatigue
Definition: field_type.cpp:354
static const efftype_id effect_evil("evil")
static const trap_str_id tr_portal("tr_portal")
const morale_type MORALE_FEELING_GOOD("morale_feeling_good")

References _, Creature::add_effect(), map::add_field(), Character::add_morale(), add_msg(), AEP_ALL_DOWN, AEP_ALL_UP, AEP_DEX_DOWN, AEP_DEX_UP, AEP_EVIL, AEP_EXTINGUISH, AEP_FUN, AEP_HUNGER, AEP_INT_DOWN, AEP_INT_UP, AEP_PBLUE, AEP_PER_DOWN, AEP_PER_UP, AEP_RADIOACTIVE, AEP_SCHIZO, AEP_SMOKE, AEP_SNAKES, AEP_SPEED_DOWN, AEP_SPEED_UP, AEP_STR_DOWN, AEP_STR_UP, AEP_THIRST, item::ammo_capacity(), item::ammo_remaining(), ARTC_FATIGUE, ARTC_HP, ARTC_NULL, ARTC_PAIN, ARTC_PORTAL, ARTC_SOLAR, ARTC_TIME, itype::artifact, item::charges, check_art_charge_req(), Character::dex_cur, effect_evil, fd_fatigue, fd_fire, fd_smoke, Character::get_dex(), Character::get_int(), Character::get_per(), Character::get_rad(), Character::get_str(), Character::hurtall(), Character::int_cur, Character::irradiate(), item::is_armor(), is_in_sunlight(), item::is_tool(), Character::is_worn(), trap::loadid, m, m_bad, m_good, Character::mod_dex_bonus(), Character::mod_fatigue(), map::mod_field_age(), Character::mod_int_bonus(), Creature::mod_pain_noresist(), Character::mod_per_bonus(), Character::mod_rad(), Character::mod_stamina(), Character::mod_stored_kcal(), Character::mod_str_bonus(), Character::mod_thirst(), MORALE_FEELING_GOOD, NUM_ARTCS, calendar::once_every(), one_in(), Character::per_cur, map::points_in_radius(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), map::remove_field(), map::remove_trap(), rng(), Character::str_cur, item::tname(), map::tr_at(), tr_portal, item::type, u, and Character::weapon.

◆ process_voluntary_act_interrupt()

void game::process_voluntary_act_interrupt ( )
private

Definition at line 1610 of file game.cpp.

1611{
1612 if( u.has_effect( effect_sleep ) ) {
1613 // Can't interrupt
1614 return;
1615 }
1616
1617 bool has_activity = u.activity && u.activity.moves_left > 0;
1618 bool is_travelling = u.has_destination() && !u.omt_path.empty();
1619
1620 if( !has_activity && !is_travelling ) {
1621 // Nohing to interrupt
1622 return;
1623 }
1624
1625 // Key poll may be quite expensive, so limit it to 10 times per second.
1626 static auto last_poll = std::chrono::steady_clock::now();
1627 auto now = std::chrono::steady_clock::now();
1628 int64_t difference = std::chrono::duration_cast<std::chrono::milliseconds>
1629 ( now - last_poll ).count();
1630
1631 if( difference > 100 ) {
1633 last_poll = now;
1634 }
1635
1636 // If player is performing a task and a monster is dangerously close, warn them
1637 // regardless of previous safemode warnings.
1638 // Distraction Manager can change this.
1639 if( has_activity && !u.has_activity( activity_id( "ACT_AIM" ) ) &&
1641 Creature *hostile_critter = is_hostile_very_close();
1642 if( hostile_critter != nullptr ) {
1644 string_format( _( "The %s is dangerously close!" ),
1645 hostile_critter->get_name() ) );
1646 }
1647 }
1648}
bool has_activity(const activity_id &type) const
Check if player currently has a given activity.
Definition: character.cpp:9178
virtual std::string get_name() const =0
void handle_key_blocking_activity()
Definition: game.cpp:1971
int moves_left
The number of moves remaining in this activity before it is complete.

References _, Character::activity, cancel_activity_or_ignore_query(), effect_sleep, Creature::get_name(), handle_key_blocking_activity(), Character::has_activity(), Character::has_destination(), Creature::has_effect(), hostile_spotted_near, player_activity::is_distraction_ignored(), is_hostile_very_close(), player_activity::moves_left, Character::omt_path, string_format(), and u.

Referenced by do_turn().

◆ prompt_dangerous_tile()

bool game::prompt_dangerous_tile ( const tripoint dest_loc) const

Definition at line 8662 of file game.cpp.

8663{
8664 std::vector<std::string> harmful_stuff = get_dangerous_tile( dest_loc );
8665
8666 if( !harmful_stuff.empty() &&
8667 !query_yn( _( "Really step into %s?" ), enumerate_as_string( harmful_stuff ) ) ) {
8668 return false;
8669 }
8670 if( !harmful_stuff.empty() && u.is_mounted() &&
8671 m.tr_at( dest_loc ).loadid == tr_ledge ) {
8672 add_msg( m_warning, _( "Your %s refuses to move over that ledge!" ),
8673 u.mounted_creature->get_name() );
8674 return false;
8675 }
8676 return true;
8677}

References _, add_msg(), enumerate_as_string(), get_dangerous_tile(), Character::is_mounted(), trap::loadid, m, m_warning, Character::mounted_creature, query_yn(), map::tr_at(), tr_ledge, and u.

Referenced by npc_menu(), and walk_move().

◆ quickload()

void game::quickload ( )
private

Definition at line 11252 of file game.cpp.

11253{
11254 const WORLDPTR active_world = world_generator->active_world;
11255 if( active_world == nullptr ) {
11256 return;
11257 }
11258
11259 if( active_world->save_exists( save_t::from_player_name( u.name ) ) ) {
11260 if( moves_since_last_save != 0 ) { // See if we need to reload anything
11261 MAPBUFFER.reset();
11263 try {
11264 setup();
11265 } catch( const std::exception &err ) {
11266 debugmsg( "Error: %s", err.what() );
11267 }
11269 }
11270 } else {
11271 popup_getkey( _( "No saves for %s yet." ), u.name );
11272 }
11273}
bool load(const std::string &world)
Attempt to load first valid save (if any) in world.
Definition: game.cpp:2508
void setup()
Definition: game.cpp:475
static save_t from_player_name(const std::string &name)
int popup_getkey(const char *const mes, Args &&... args)
Definition: output.h:457
bool save_exists(const save_t &name) const

References _, overmapbuffer::clear(), debugmsg, save_t::from_player_name(), load(), MAPBUFFER, moves_since_last_save, Character::name, overmap_buffer, popup_getkey(), mapbuffer::reset(), WORLD::save_exists(), setup(), u, and world_generator.

Referenced by handle_action().

◆ quicksave()

void game::quicksave ( )

Definition at line 11230 of file game.cpp.

11231{
11232 //Don't autosave if the player hasn't done anything since the last autosave/quicksave,
11233 if( !moves_since_last_save ) {
11234 return;
11235 }
11236 add_msg( m_info, _( "Saving game, this may take a while" ) );
11237
11239 popup.message( "%s", _( "Saving game, this may take a while" ) );
11242
11243 time_t now = time( nullptr ); //timestamp for start of saving procedure
11244
11245 //perform save
11246 save();
11247 //Now reset counters for autosaving, so we don't immediately autosave after a quicksave or autosave.
11249 last_save_timestamp = now;
11250}

References _, add_msg(), last_save_timestamp, m_info, moves_since_last_save, popup(), ui_manager::redraw(), refresh_display(), save(), and time.

Referenced by autosave(), and handle_action().

◆ reenter_fullscreen()

void game::reenter_fullscreen ( )

Definition at line 463 of file game.cpp.

464{
465 if( was_fullscreen ) {
466 if( !fullscreen ) {
468 }
469 }
470}

References fullscreen, toggle_fullscreen(), and was_fullscreen.

Referenced by list_items_monsters(), and look_around().

◆ reload_npcs()

void game::reload_npcs ( )

Unloads, then loads the NPCs.

Definition at line 868 of file game.cpp.

869{
870 // TODO: Make it not invoke the "on_unload" command for the NPCs that will be loaded anyway
871 // and not invoke "on_load" for those NPCs that avoided unloading this way.
872 unload_npcs();
873 load_npcs();
874}

References load_npcs(), and unload_npcs().

Referenced by load(), overmap_npc_move(), vertical_move(), and vertical_shift().

◆ reload_tileset()

void game::reload_tileset ( std::function< void(std::string)>  out)

Definition at line 427 of file game.cpp.

428{
429#if defined(TILES)
430 // Disable UIs below to avoid accessing the tile context during loading.
432 try {
433 tilecontext->reinit();
434 std::vector<mod_id> dummy;
435 tilecontext->load_tileset(
436 get_option<std::string>( "TILES" ),
437 world_generator->active_world ? world_generator->active_world->active_mod_order : dummy,
438 /*precheck=*/false,
439 /*force=*/true,
440 /*pump_events=*/true
441 );
442 tilecontext->do_tile_loading_report( out );
443 } catch( const std::exception &err ) {
444 popup( _( "Loading the tileset failed: %s" ), err.what() );
445 }
446 g->reset_zoom();
447 g->mark_main_ui_adaptor_resize();
448#endif // TILES
449}

References _, g, popup(), and world_generator.

Referenced by handle_action().

◆ remoteveh()

vehicle * game::remoteveh ( )

Returns the current remotely controlled vehicle.

Definition at line 2248 of file game.cpp.

2249{
2251 return remoteveh_cache;
2252 }
2254 std::stringstream remote_veh_string( u.get_value( "remote_controlling_vehicle" ) );
2255 if( remote_veh_string.str().empty() ||
2257 remoteveh_cache = nullptr;
2258 } else {
2259 tripoint vp;
2260 remote_veh_string >> vp.x >> vp.y >> vp.z;
2261 vehicle *veh = veh_pointer_or_null( m.veh_at( vp ) );
2262 if( veh && veh->fuel_left( itype_battery, true ) > 0 ) {
2263 remoteveh_cache = veh;
2264 } else {
2265 remoteveh_cache = nullptr;
2266 }
2267 }
2268 return remoteveh_cache;
2269}
vehicle * remoteveh_cache
Definition: game.h:1045
int fuel_left(const itype_id &ftype, bool recurse=false) const
Definition: vehicle.cpp:3360
static const bionic_id bio_remote("bio_remote")
static const itype_id itype_remotevehcontrol("remotevehcontrol")
static const itype_id itype_battery("battery")

References bio_remote, vehicle::fuel_left(), Creature::get_value(), Character::has_active_bionic(), Character::has_active_item(), itype_battery, itype_remotevehcontrol, m, remoteveh_cache, remoteveh_cache_time, calendar::turn, u, map::veh_at(), veh_pointer_or_null(), tripoint::x, tripoint::y, and tripoint::z.

Referenced by control_vehicle(), and handle_action().

◆ remove_npc_follower()

void game::remove_npc_follower ( const character_id id)

Remove follower id from follower set.

Definition at line 1880 of file game.cpp.

1881{
1882 follower_ids.erase( id );
1883 u.follower_ids.erase( id );
1884}

References follower_ids, player::follower_ids, and u.

Referenced by cleanup_dead().

◆ remove_zombie()

void game::remove_zombie ( const monster critter)

Definition at line 4688 of file game.cpp.

4689{
4690 critter_tracker->remove( critter );
4691}

References critter_tracker.

Referenced by despawn_monster(), disable_robot(), start_game(), and vertical_move().

◆ replace_stair_monsters()

void game::replace_stair_monsters ( )
private

Definition at line 10751 of file game.cpp.

10752{
10753 for( auto &elem : coming_to_stairs ) {
10754 elem.staircount = 0;
10755 const tripoint pnt( elem.pos().xy(), get_levz() );
10756 place_critter_around( make_shared_fast<monster>( elem ), pnt, 10 );
10757 }
10758
10759 coming_to_stairs.clear();
10760}
std::vector< monster > coming_to_stairs
Definition: game.h:983

References coming_to_stairs, get_levz(), and place_critter_around().

◆ reset_item_list_state()

void game::reset_item_list_state ( const catacurses::window window,
int  height,
bool  bRadiusSort 
)
private

Definition at line 7122 of file game.cpp.

7124{
7125 const int width = getmaxx( window );
7126 for( int i = 1; i < TERMX; i++ ) {
7127 if( i < width ) {
7128 mvwputch( window, point( i, 0 ), c_light_gray, LINE_OXOX ); // -
7129 mvwputch( window, point( i, TERMY - height - 1 ), c_light_gray,
7130 LINE_OXOX ); // -
7131 }
7132
7133 if( i < TERMY - height ) {
7134 mvwputch( window, point( 0, i ), c_light_gray, LINE_XOXO ); // |
7135 mvwputch( window, point( width - 1, i ), c_light_gray, LINE_XOXO ); // |
7136 }
7137 }
7138
7139 mvwputch( window, point_zero, c_light_gray, LINE_OXXO ); // |^
7140 mvwputch( window, point( width - 1, 0 ), c_light_gray, LINE_OOXX ); // ^|
7141
7142 mvwputch( window, point( 0, TERMY - height - 1 ), c_light_gray,
7143 LINE_XXXO ); // |-
7144 mvwputch( window, point( width - 1, TERMY - height - 1 ), c_light_gray,
7145 LINE_XOXX ); // -|
7146
7147 mvwprintz( window, point( 2, 0 ), c_light_green, "<Tab> " );
7148 wprintz( window, c_white, _( "Items" ) );
7149
7150 std::string sSort;
7151 if( bRadiusSort ) {
7152 //~ Sort type: distance.
7153 sSort = _( "<s>ort: dist" );
7154 } else {
7155 //~ Sort type: category.
7156 sSort = _( "<s>ort: cat" );
7157 }
7158
7159 int letters = utf8_width( sSort );
7160
7161 shortcut_print( window, point( getmaxx( window ) - letters, 0 ), c_white, c_light_green, sSort );
7162
7163 std::vector<std::string> tokens;
7164 if( !sFilter.empty() ) {
7165 tokens.emplace_back( _( "<R>eset" ) );
7166 }
7167
7168 tokens.emplace_back( _( "<E>xamine" ) );
7169 tokens.emplace_back( _( "<C>ompare" ) );
7170 tokens.emplace_back( _( "<F>ilter" ) );
7171 tokens.emplace_back( _( "<+/->Priority" ) );
7172
7173 int gaps = tokens.size() + 1;
7174 letters = 0;
7175 int n = tokens.size();
7176 for( int i = 0; i < n; i++ ) {
7177 letters += utf8_width( tokens[i] ) - 2; //length ignores < >
7178 }
7179
7180 int usedwidth = letters;
7181 const int gap_spaces = ( width - usedwidth ) / gaps;
7182 usedwidth += gap_spaces * gaps;
7183 point pos( gap_spaces + ( width - usedwidth ) / 2, TERMY - height - 1 );
7184
7185 for( int i = 0; i < n; i++ ) {
7186 pos.x += shortcut_print( window, pos, c_white, c_light_green,
7187 tokens[i] ) + gap_spaces;
7188 }
7189}
#define LINE_OOXX
Definition: output.h:43
#define LINE_OXXO
Definition: output.h:42

References _, c_light_gray, c_light_green, c_white, catacurses::getmaxx(), LINE_OOXX, LINE_OXOX, LINE_OXXO, LINE_XOXO, LINE_XOXX, LINE_XXXO, mvwprintz(), mvwputch(), point_zero, sFilter, shortcut_print(), TERMX, TERMY, utf8_width(), wprintz(), and point::x.

Referenced by list_items().

◆ reset_light_level()

void game::reset_light_level ( )

Definition at line 3546 of file game.cpp.

3547{
3548 for( float &lev : latest_lightlevels ) {
3549 lev = -std::numeric_limits<float>::max();
3550 }
3551}

References latest_lightlevels.

Referenced by do_turn(), and game().

◆ reset_npc_dispositions()

void game::reset_npc_dispositions ( )
private

Definition at line 2621 of file game.cpp.

2622{
2623 for( auto elem : follower_ids ) {
2624 shared_ptr_fast<npc> npc_to_get = overmap_buffer.find_npc( elem );
2625 if( !npc_to_get ) {
2626 continue;
2627 }
2628 npc *npc_to_add = npc_to_get.get();
2629 npc_to_add->chatbin.missions.clear();
2630 npc_to_add->chatbin.missions_assigned.clear();
2631 npc_to_add->mission = NPC_MISSION_NULL;
2632 npc_to_add->chatbin.mission_selected = nullptr;
2633 npc_to_add->set_attitude( NPCATT_NULL );
2634 npc_to_add->op_of_u.anger = 0;
2635 npc_to_add->op_of_u.fear = 0;
2636 npc_to_add->op_of_u.trust = 0;
2637 npc_to_add->op_of_u.value = 0;
2638 npc_to_add->op_of_u.owed = 0;
2639 npc_to_add->set_fac( faction_id( "no_faction" ) );
2641 npc_to_add->global_omt_location(),
2642 npc_to_add->getID() ) );
2643
2644 }
2645
2646}
void set_attitude(npc_attitude new_attitude)
Definition: npc.cpp:3169
npc_chatbin chatbin
Definition: npc.h:1288
void add_new_mission(mission *miss)
See npc_chatbin::add_new_mission.
Definition: npc.cpp:2660
npc_opinion op_of_u
Definition: npc.h:1287
void set_fac(const faction_id &id)
Definition: npc.cpp:473
std::vector< mission * > missions_assigned
Mission that have been assigned by this NPC to a player character.
Definition: npc.h:715
mission * mission_selected
The mission (if any) that we talk about right now.
Definition: npc.h:720
std::vector< mission * > missions
Missions that the NPC can give out.
Definition: npc.h:711
int value
Definition: npc.h:205
int trust
Definition: npc.h:203
int owed
Definition: npc.h:207
int fear
Definition: npc.h:204
int anger
Definition: npc.h:206

References npc::add_new_mission(), npc_opinion::anger, npc::chatbin, npc_opinion::fear, overmapbuffer::find_npc(), follower_ids, Character::getID(), Character::global_omt_location(), npc::mission, npc_chatbin::mission_selected, npc_chatbin::missions, npc_chatbin::missions_assigned, NPC_MISSION_NULL, NPCATT_NULL, npc::op_of_u, ORIGIN_ANY_NPC, overmap_buffer, npc_opinion::owed, mission::reserve_random(), npc::set_attitude(), npc::set_fac(), npc_opinion::trust, and npc_opinion::value.

Referenced by cleanup_at_end().

◆ reset_zoom()

void game::reset_zoom ( )

Definition at line 7037 of file game.cpp.

7038{
7039#if defined(TILES)
7041 rescale_tileset( tileset_zoom );
7042#endif // TILES
7043}

References DEFAULT_TILESET_ZOOM, and tileset_zoom.

◆ revive_corpse()

bool game::revive_corpse ( const tripoint p,
item it 
)

Revives a corpse at given location.

The monster type and some of its properties are deducted from the corpse. If reviving succeeds, the location is guaranteed to have a new monster there (see critter_at).

Parameters
pThe place where to put the revived monster.
itThe corpse item, it must be a valid corpse (see item::is_corpse).
Returns
Whether the corpse has actually been redivided. Reviving may fail for many reasons, including no space to put the monster, corpse being to much damaged etc. If the monster was revived, the caller should remove the corpse item. If reviving failed, the item is unchanged, as is the environment (no new monsters).

Definition at line 4818 of file game.cpp.

4819{
4820 if( !it.is_corpse() ) {
4821 debugmsg( "Tried to revive a non-corpse." );
4822 return false;
4823 }
4824 shared_ptr_fast<monster> newmon_ptr = make_shared_fast<monster>
4825 ( it.get_mtype()->id );
4826 monster &critter = *newmon_ptr;
4827 critter.init_from_item( it );
4828 if( critter.get_hp() < 1 ) {
4829 // Failed reanimation due to corpse being too burned
4830 return false;
4831 }
4832 if( it.has_flag( "FIELD_DRESS" ) || it.has_flag( "FIELD_DRESS_FAILED" ) ||
4833 it.has_flag( "QUARTERED" ) ) {
4834 // Failed reanimation due to corpse being butchered
4835 return false;
4836 }
4837
4838 critter.no_extra_death_drops = true;
4839 critter.add_effect( effect_downed, 5_turns, num_bp );
4840 for( const item &component : it.components ) {
4841 critter.corpse_components.push_back( component );
4842 }
4843
4844 if( it.get_var( "zlave" ) == "zlave" ) {
4845 critter.add_effect( effect_pacified, 1_turns, num_bp );
4846 critter.add_effect( effect_pet, 1_turns, num_bp );
4847 }
4848
4849 if( it.get_var( "no_ammo" ) == "no_ammo" ) {
4850 for( auto &ammo : critter.ammo ) {
4851 ammo.second = 0;
4852 }
4853 }
4854
4855 return place_critter_at( newmon_ptr, p );
4856}
monster * place_critter_at(const mtype_id &id, const tripoint &p)
Adds critters to the reality bubble, creating them if necessary.
Definition: game.cpp:4616
double get_var(const std::string &name, double default_value) const
Definition: item.cpp:1030
const mtype * get_mtype() const
Definition: item.cpp:6630
std::list< item > components
Definition: item.h:2159
bool has_flag(const std::string &flag) const
Definition: item.cpp:5308
bool is_corpse() const
Whether this is a corpse item.
Definition: item.cpp:6625
int get_hp(const bodypart_id &) const override
Definition: monster.cpp:2921
bool no_extra_death_drops
Definition: monster.h:479
std::vector< item > corpse_components
Definition: monster.h:456
void init_from_item(const item &itm)
Initialize values like speed / hp from data of an item.
Definition: monster.cpp:2791
static const efftype_id effect_downed("downed")
static const efftype_id effect_pacified("pacified")

References monster::add_effect(), monster::ammo, item::components, monster::corpse_components, debugmsg, effect_downed, effect_pacified, effect_pet, monster::get_hp(), item::get_mtype(), item::get_var(), item::has_flag(), mtype::id, monster::init_from_item(), item::is_corpse(), monster::no_extra_death_drops, num_bp, and place_critter_at().

◆ save()

bool game::save ( )

Returns false if saving failed.

Definition at line 2722 of file game.cpp.

2723{
2724 try {
2725 if( !save_player_data() ||
2727 !save_artifacts() ||
2728 !save_maps() ||
2729 !get_auto_pickup().save_character() ||
2731 !get_safemode().save_character() ||
2732 !write_to_file( get_world_base_save_path() + "/uistate.json", [&]( std::ostream & fout ) {
2733 JsonOut jsout( fout );
2734 uistate.serialize( jsout );
2735 }, _( "uistate data" ) ) ) {
2736 return false;
2737 } else {
2738 world_generator->active_world->add_save( save_t::from_player_name( u.name ) );
2739 return true;
2740 }
2741 } catch( std::ios::failure &err ) {
2742 popup( _( "Failed to save game data" ) );
2743 return false;
2744 }
2745}
void write_to_file(const std::string &path, const std::function< void(std::ostream &)> &writer)
Definition: json.h:576
bool save_player_data()
Definition: game.cpp:2676
void serialize(JsonOut &json) const
@ failure
Definition: behavior.h:20

References _, behavior::failure, save_t::from_player_name(), get_auto_notes_settings(), get_auto_pickup(), get_safemode(), get_world_base_save_path(), Character::name, popup(), save(), save_artifacts(), save_factions_missions_npcs(), save_maps(), save_player_data(), uistatedata::serialize(), u, uistate, world_generator, and write_to_file().

Referenced by handle_action(), quicksave(), and save().

◆ save_artifacts()

bool game::save_artifacts ( )
private

Definition at line 2657 of file game.cpp.

2658{
2659 std::string artfilename = get_world_base_save_path() + "/" + SAVE_ARTIFACTS;
2660 return ::save_artifacts( artfilename );
2661}
bool save_artifacts(const std::string &path)
Definition: artifact.cpp:1277
static const std::string SAVE_ARTIFACTS("artifacts.gsav")

References get_world_base_save_path(), SAVE_ARTIFACTS(), and save_artifacts().

Referenced by cleanup_at_end(), and save().

◆ save_cyborg()

void game::save_cyborg ( item cyborg,
const tripoint couch_pos,
player installer 
)

Turns Broken Cyborg monster into Cyborg NPC via surgery.

Definition at line 4879 of file game.cpp.

4880{
4881 int assist_bonus = installer.get_effect_int( effect_assisted );
4882
4883 float adjusted_skill = installer.bionics_adjusted_skill( skill_firstaid,
4886 -1 );
4887
4888 int damage = cyborg->damage();
4889 int dmg_lvl = cyborg->damage_level( 4 );
4890 int difficulty = 12;
4891
4892 if( damage != 0 ) {
4893
4894 popup( _( "WARNING: Patient's body is damaged. Difficulty of the procedure is increased by %s." ),
4895 dmg_lvl );
4896
4897 // Damage of the cyborg increases difficulty
4898 difficulty += dmg_lvl;
4899 }
4900
4901 int chance_of_success = bionic_manip_cos( adjusted_skill + assist_bonus, difficulty );
4902 int success = chance_of_success - rng( 1, 100 );
4903
4904 if( !g->u.query_yn(
4905 _( "WARNING: %i percent chance of SEVERE damage to all body parts! Continue anyway?" ),
4906 100 - static_cast<int>( chance_of_success ) ) ) {
4907 return;
4908 }
4909
4910 if( success > 0 ) {
4911 add_msg( m_good, _( "Successfully removed Personality override." ) );
4912 add_msg( m_bad, _( "Autodoc immediately destroys the CBM upon removal." ) );
4913
4914 delete_cyborg_item( g->m, couch_pos, cyborg );
4915
4916 const string_id<npc_template> npc_cyborg( "cyborg_rescued" );
4917 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
4918 tmp->load_npc_template( npc_cyborg );
4919 tmp->spawn_at_precise( { get_levx(), get_levy() }, couch_pos );
4921 tmp->hurtall( dmg_lvl * 10, nullptr );
4922 tmp->add_effect( effect_downed, rng( 1_turns, 4_turns ), num_bp, 0, true );
4923 load_npcs();
4924
4925 } else {
4926 const int failure_level = static_cast<int>( std::sqrt( std::abs( success ) * 4.0 * difficulty /
4927 adjusted_skill ) );
4928 const int fail_type = std::min( 5, failure_level );
4929 switch( fail_type ) {
4930 case 1:
4931 case 2:
4932 add_msg( m_info, _( "The removal fails." ) );
4933 add_msg( m_bad, _( "The body is damaged." ) );
4934 cyborg->set_damage( damage + 1000 );
4935 break;
4936 case 3:
4937 case 4:
4938 add_msg( m_info, _( "The removal fails badly." ) );
4939 add_msg( m_bad, _( "The body is badly damaged!" ) );
4940 cyborg->set_damage( damage + 2000 );
4941 break;
4942 case 5:
4943 add_msg( m_info, _( "The removal is a catastrophe." ) );
4944 add_msg( m_bad, _( "The body is destroyed!" ) );
4945 delete_cyborg_item( g->m, couch_pos, cyborg );
4946 break;
4947 default:
4948 break;
4949 }
4950
4951 }
4952
4953}
int bionic_manip_cos(float adjusted_skill, int bionic_difficulty)
Definition: bionics.cpp:1883
float bionics_adjusted_skill(const skill_id &most_important_skill, const skill_id &important_skill, const skill_id &least_important_skill, int skill_level=-1)
Calculate skill for (un)installing bionics.
Definition: bionics.cpp:1840
item & set_damage(int qty)
Filter setting damage constrained by min_damage and max_damage.
Definition: item.cpp:714
int damage_level(int max) const
Scale item damage to the given number of levels.
Definition: item.cpp:701
int damage() const
How much damage has the item sustained?
Definition: item.cpp:696
static const skill_id skill_computer("computer")
static void delete_cyborg_item(map &m, const tripoint &couch_pos, item *cyborg)
Definition: game.cpp:4858
static const efftype_id effect_assisted("assisted")
static const skill_id skill_electronics("electronics")
@ success
Definition: behavior.h:20

References _, add_msg(), bionic_manip_cos(), Character::bionics_adjusted_skill(), item::damage(), item::damage_level(), delete_cyborg_item(), effect_assisted, effect_downed, g, Creature::get_effect_int(), get_levx(), get_levy(), overmapbuffer::insert_npc(), load_npcs(), m_bad, m_good, m_info, num_bp, overmap_buffer, popup(), rng(), item::set_damage(), skill_computer, skill_electronics, skill_firstaid, and behavior::success.

◆ save_factions_missions_npcs()

bool game::save_factions_missions_npcs ( )
private

Definition at line 2649 of file game.cpp.

2650{
2651 std::string masterfile = get_world_base_save_path() + "/" + SAVE_MASTER;
2652 return write_to_file( masterfile, [&]( std::ostream & fout ) {
2653 serialize_master( fout );
2654 }, _( "factions data" ) );
2655}
void serialize_master(std::ostream &fout)
Definition: savegame.cpp:1243

References _, get_world_base_save_path(), SAVE_MASTER(), serialize_master(), and write_to_file().

Referenced by cleanup_at_end(), and save().

◆ save_maps()

bool game::save_maps ( )
private

Definition at line 2663 of file game.cpp.

2664{
2665 try {
2666 m.save();
2667 overmap_buffer.save(); // can throw
2668 MAPBUFFER.save(); // can throw
2669 return true;
2670 } catch( const std::exception &err ) {
2671 popup( _( "Failed to save the maps: %s" ), err.what() );
2672 return false;
2673 }
2674}
void save(bool delete_after_save=false)
Store all submaps in this instance into savefiles.
Definition: mapbuffer.cpp:103

References _, m, MAPBUFFER, overmap_buffer, popup(), map::save(), overmapbuffer::save(), and mapbuffer::save().

Referenced by cleanup_at_end(), and save().

◆ save_player_data()

bool game::save_player_data ( )
private

Definition at line 2676 of file game.cpp.

2677{
2678 const std::string playerfile = get_player_base_save_path();
2679
2680 const bool saved_data = write_to_file( playerfile + SAVE_EXTENSION, [&]( std::ostream & fout ) {
2681 serialize( fout );
2682 }, _( "player data" ) );
2683 const bool saved_map_memory = u.save_map_memory();
2684 const bool saved_log = write_to_file( playerfile + SAVE_EXTENSION_LOG, [&](
2685 std::ostream & fout ) {
2686 fout << memorial().dump();
2687 }, _( "player memorial" ) );
2688#if defined(__ANDROID__)
2689 const bool saved_shortcuts = write_to_file( playerfile + SAVE_EXTENSION_SHORTCUTS, [&](
2690 std::ostream & fout ) {
2691 save_shortcuts( fout );
2692 }, _( "quick shortcuts" ) );
2693#endif
2694 const bool saved_diary = u.get_avatar_diary()->store();
2695 return saved_data && saved_map_memory && saved_log && saved_diary
2696#if defined(__ANDROID__)
2697 && saved_shortcuts
2698#endif
2699 ;
2700}
bool save_map_memory()
Definition: avatar.cpp:132
bool store()
Definition: diary.cpp:760
std::string get_player_base_save_path() const
Base path for saving player data.
Definition: game.cpp:11969
void serialize(std::ostream &fout)
Saving and loading functions.
Definition: savegame.cpp:69
std::string dump() const
Concatenates all of the memorial log entries, delimiting them with newlines, and returns the resultin...

References _, memorial_logger::dump(), avatar::get_avatar_diary(), get_player_base_save_path(), memorial(), SAVE_EXTENSION(), SAVE_EXTENSION_LOG(), SAVE_EXTENSION_SHORTCUTS(), avatar::save_map_memory(), serialize(), diary::store(), u, and write_to_file().

Referenced by save().

◆ serialize()

void game::serialize ( std::ostream &  fout)

Saving and loading functions.

Definition at line 69 of file savegame.cpp.

70{
71 /*
72 * Format version 12: Fully json, save the header. Weather and memorial exist elsewhere.
73 * To prevent (or encourage) confusion, there is no version 8. (cata 0.8 uses v7)
74 */
75 // Header
76 fout << "# version " << savegame_version << std::endl;
77
78 JsonOut json( fout, true ); // pretty-print
79
80 json.start_object();
81 // basic game state information.
82 json.member( "turn", calendar::turn );
84 json.member( "calendar_start", calendar_config._start_of_cataclysm );
85 json.member( "game_start", calendar_config._start_of_game );
86 json.member( "initial_season", static_cast<int>( calendar_config._initial_season ) );
87 json.member( "auto_travel_mode", auto_travel_mode );
88 json.member( "run_mode", static_cast<int>( safe_mode ) );
89 json.member( "mostseen", mostseen );
90 // current map coordinates
91 tripoint pos_sm = m.get_abs_sub();
92 const point pos_om = sm_to_om_remain( pos_sm.x, pos_sm.y );
93 json.member( "levx", pos_sm.x );
94 json.member( "levy", pos_sm.y );
95 json.member( "levz", pos_sm.z );
96 json.member( "om_x", pos_om.x );
97 json.member( "om_y", pos_om.y );
98
99 json.member( "grscent", scent.serialize() );
100 json.member( "typescent", scent.serialize( true ) );
101
102 // Then each monster
103 json.member( "active_monsters", *critter_tracker );
104 json.member( "stair_monsters", coming_to_stairs );
105
106 // save stats.
107 json.member( "kill_tracker", *kill_tracker_ptr );
108 json.member( "stats_tracker", *stats_tracker_ptr );
109 json.member( "achievements_tracker", *achievements_tracker_ptr );
110
111 json.member( "token_provider", *token_provider_ptr );
112
113 json.member( "player", u );
114 Messages::serialize( json );
115
116 json.end_object();
117}
A class that keeps time data other than current time.
Definition: calendar.h:530
season_type _initial_season
Definition: calendar.h:534
time_point _start_of_game
Definition: calendar.h:533
time_point _start_of_cataclysm
Definition: calendar.h:532
pimpl< drop_token_provider > token_provider_ptr
Definition: game.h:975
std::string serialize(bool is_type=false) const
Definition: savegame.cpp:119
point sm_to_om_remain(int &x, int &y)
void serialize(JsonOut &json)
Definition: messages.cpp:321
calendar_config config
const int savegame_version
Definition: savegame.cpp:57

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, achievements_tracker_ptr, auto_travel_mode, coming_to_stairs, calendar::config, critter_tracker, JsonOut::end_object(), map::get_abs_sub(), kill_tracker_ptr, m, JsonOut::member(), mostseen, safe_mode, savegame_version, scent, scent_map::serialize(), Messages::serialize(), sm_to_om_remain(), JsonOut::start_object(), stats_tracker_ptr, token_provider_ptr, calendar::turn, u, point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

Referenced by save_player_data().

◆ serialize_master()

void game::serialize_master ( std::ostream &  fout)
private

Definition at line 1243 of file savegame.cpp.

1244{
1245 fout << "# version " << savegame_version << std::endl;
1246 try {
1247 JsonOut json( fout, true ); // pretty-print
1248 json.start_object();
1249
1250 json.member( "next_mission_id", next_mission_id );
1251 json.member( "next_npc_id", next_npc_id );
1252
1253 json.member( "active_missions" );
1254 mission::serialize_all( json );
1255
1256 json.member( "factions", *faction_manager_ptr );
1257 json.member( "seed", seed );
1258
1259 json.member( "weather" );
1260 json.start_object();
1261 json.member( "lightning", get_weather().lightning_active );
1262 json.end_object();
1263
1264 json.end_object();
1265 } catch( const JsonError &e ) {
1266 debugmsg( "error saving to %s: %s", SAVE_MASTER, e.c_str() );
1267 }
1268}
Definition: json.h:52
const char * c_str() const noexcept
Definition: json.h:55
static void serialize_all(JsonOut &json)
Definition: savegame.cpp:1234

References JsonError::c_str(), debugmsg, JsonOut::end_object(), faction_manager_ptr, get_weather, JsonOut::member(), next_mission_id, next_npc_id, SAVE_MASTER(), savegame_version, seed, mission::serialize_all(), and JsonOut::start_object().

Referenced by save_factions_missions_npcs().

◆ set_critter_died()

void game::set_critter_died ( )

If invoked, dead will be cleaned this turn.

Definition at line 1788 of file game.cpp.

1789{
1790 critter_died = true;
1791}

References critter_died.

◆ set_driving_view_offset()

void game::set_driving_view_offset ( const point p)

Definition at line 1598 of file game.cpp.

1599{
1600 // remove the previous driving offset,
1601 // store the new offset and apply the new offset.
1608}

References driving_view_offset, u, player::view_offset, point::x, tripoint::x, point::y, and tripoint::y.

Referenced by calc_driving_offset(), and cleanup_at_end().

◆ set_npcs_dirty()

void game::set_npcs_dirty ( )

If invoked, NPCs will be reloaded before next turn.

Definition at line 1783 of file game.cpp.

1784{
1785 npcs_dirty = true;
1786}

References npcs_dirty.

◆ set_safe_mode()

void game::set_safe_mode ( safe_mode_type  mode)

Definition at line 8589 of file game.cpp.

8590{
8591 safe_mode = mode;
8593}

References safe_mode, and safe_mode_warning_logged.

Referenced by handle_action(), and mon_info_update().

◆ set_zoom()

void game::set_zoom ( int  level)

Definition at line 7045 of file game.cpp.

7046{
7047#if defined(TILES)
7048 if( tileset_zoom != level ) {
7049 tileset_zoom = level;
7050 rescale_tileset( tileset_zoom );
7051 }
7052#else
7053 static_cast<void>( level );
7054#endif // TILES
7055}

References tileset_zoom.

Referenced by look_around().

◆ setremoteveh()

void game::setremoteveh ( vehicle veh)

Sets the current remotely controlled vehicle.

Definition at line 2271 of file game.cpp.

2272{
2274 remoteveh_cache = veh;
2275 if( veh != nullptr && !u.has_active_bionic( bio_remote ) &&
2277 debugmsg( "Tried to set remote vehicle without bio_remote or remotevehcontrol" );
2278 veh = nullptr;
2279 }
2280
2281 if( veh == nullptr ) {
2282 u.remove_value( "remote_controlling_vehicle" );
2283 return;
2284 }
2285
2286 std::stringstream remote_veh_string;
2287 const tripoint vehpos = veh->global_pos3();
2288 remote_veh_string << vehpos.x << ' ' << vehpos.y << ' ' << vehpos.z;
2289 u.set_value( "remote_controlling_vehicle", remote_veh_string.str() );
2290}
void remove_value(const std::string &key)
Definition: creature.cpp:1342

References bio_remote, debugmsg, vehicle::global_pos3(), Character::has_active_bionic(), Character::has_active_item(), itype_remotevehcontrol, remoteveh_cache, remoteveh_cache_time, Creature::remove_value(), Creature::set_value(), calendar::turn, u, tripoint::x, tripoint::y, and tripoint::z.

◆ setup()

void game::setup ( )

Definition at line 475 of file game.cpp.

476{
477 loading_ui ui( true );
478
480
481 if( get_option<bool>( "ELEVATED_BRIDGES" ) && !get_option<bool>( "ZLEVELS" ) ) {
482 debugmsg( "\"Elevated bridges\" mod requires z-levels to be ENABLED to work properly!" );
483 }
484
485 m = map( get_option<bool>( "ZLEVELS" ) );
486
488 next_mission_id = 1;
489 new_game = true;
490 uquit = QUIT_NO; // We haven't quit the game
491 bVMonsterLookFire = true;
492
493 // invalidate calendar caches in case we were previously playing
494 // a different world
495 calendar::set_eternal_season( ::get_option<bool>( "ETERNAL_SEASON" ) );
496 calendar::set_season_length( ::get_option<int>( "SEASON_LENGTH" ) );
497
500
501 turnssincelastmon = 0; //Auto safe mode init
502
505 coming_to_stairs.clear();
506 active_npc.clear();
507 faction_manager_ptr->clear();
512
513 SCT.vSCT.clear(); //Delete pending messages
514
515 stats().clear();
516 // reset kill counts
517 kill_tracker_ptr->clear();
519 // reset follower list
520 follower_ids.clear();
521 scent.reset();
522
524 remoteveh_cache = nullptr;
525
526 token_provider_ptr->clear();
527 // back to menu for save loading, new game etc
528}
void clear_zombies()
Redirects to the creature_tracker clear() function.
Definition: game.cpp:4693
static void clear_all()
Remove all active missions, used to cleanup on exit and before reloading a new game.
Definition: mission.cpp:127
void reset()
Definition: scent_map.cpp:51
static const string_id< weather_type > & NULL_ID()
Returns a null id whose string_id<T>::is_null() must always return true.
void clear_messages()
Definition: messages.cpp:351
void load_world_modfiles(loading_ui &ui, const std::string &artifacts_file)
Load & finalize modlist needed for the current world.
Definition: init.cpp:872
void reset_sounds()
Definition: sounds.cpp:565

References achievements_tracker_ptr, active_npc, calendar::before_time_starts, bVMonsterLookFire, character_id, explosion_handler::explosion_queue::clear(), stats_tracker::clear(), mission::clear_all(), Messages::clear_messages(), clear_zombies(), coming_to_stairs, debugmsg, faction_manager_ptr, follower_ids, explosion_handler::get_explosion_queue(), get_weather, get_world_base_save_path(), kill_tracker_ptr, init::load_world_modfiles(), m, new_game, next_mission_id, next_npc_id, weather_manager::nextweather, string_id< weather_type >::NULL_ID(), QUIT_NO, remoteveh_cache, remoteveh_cache_time, scent_map::reset(), sounds::reset_sounds(), SAVE_ARTIFACTS(), scent, SCT, calendar::set_eternal_season(), calendar::set_season_length(), stats(), timed_events, token_provider_ptr, turnssincelastmon, uquit, scrollingcombattext::vSCT, and weather_manager::weather_id.

Referenced by butcher_submenu(), and quickload().

◆ shared_from()

template<typename T >
template shared_ptr_fast< npc > game::shared_from< npc > ( const T &  critter)

Returns a shared pointer to the given critter (which can be of any of the subclasses of Creature).

The function may return an empty pointer if the given critter is not stored anywhere (e.g. it was allocated on the stack, not stored in the critter_tracker nor in active_npc nor is it u).

Definition at line 4546 of file game.cpp.

4547{
4548 if( static_cast<const Creature *>( &critter ) == static_cast<const Creature *>( &u ) ) {
4549 // u is not stored in a shared_ptr, but it won't go out of scope anyway
4550 return std::dynamic_pointer_cast<T>( u_shared_ptr );
4551 }
4552 if( critter.is_monster() ) {
4553 if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( critter.pos() ) ) {
4554 if( static_cast<const Creature *>( mon_ptr.get() ) == static_cast<const Creature *>( &critter ) ) {
4555 return std::dynamic_pointer_cast<T>( mon_ptr );
4556 }
4557 }
4558 }
4559 if( critter.is_npc() ) {
4560 for( auto &cur_npc : active_npc ) {
4561 if( static_cast<const Creature *>( cur_npc.get() ) == static_cast<const Creature *>( &critter ) ) {
4562 return std::dynamic_pointer_cast<T>( cur_npc );
4563 }
4564 }
4565 }
4566 return nullptr;
4567}

References active_npc, critter_tracker, u, and u_shared_ptr.

Referenced by list_monsters(), mon_info_update(), and validate_mounted_npcs().

◆ shift_destination_preview()

void game::shift_destination_preview ( const point delta)

Definition at line 11982 of file game.cpp.

11983{
11984 for( tripoint &p : destination_preview ) {
11985 p += delta;
11986 }
11987}

References destination_preview.

◆ shift_monsters()

void game::shift_monsters ( const tripoint shift)
private

Shift all active monsters, the shift vector is the number of shifted submaps.

Monsters that are outside of the reality bubble after shifting are despawned. Note on z-levels: this works with vertical shifts, but currently all monsters are despawned upon a vertical shift.

Definition at line 10986 of file game.cpp.

10987{
10988 // If either shift argument is non-zero, we're shifting.
10989 if( shift == tripoint_zero ) {
10990 return;
10991 }
10992 for( monster &critter : all_monsters() ) {
10993 if( shift.xy() != point_zero ) {
10994 critter.shift( shift.xy() );
10995 }
10996
10997 if( m.inbounds( critter.pos() ) && ( shift.z == 0 || m.has_zlevels() ) ) {
10998 // We're inbounds, so don't despawn after all.
10999 // No need to shift Z-coordinates, they are absolute
11000 continue;
11001 }
11002 // Either a vertical shift or the critter is now outside of the reality bubble,
11003 // anyway: it must be saved and removed.
11004 despawn_monster( critter );
11005 }
11006 // The order in which zombies are shifted may cause zombies to briefly exist on
11007 // the same square. This messes up the mon_at cache, so we need to rebuild it.
11008 critter_tracker->rebuild_cache();
11009}

References all_monsters(), critter_tracker, despawn_monster(), map::has_zlevels(), map::inbounds(), m, point_zero, tripoint_zero, tripoint::xy(), and tripoint::z.

Referenced by update_map(), vertical_move(), and vertical_shift().

◆ slip_down()

bool game::slip_down ( )

Checks if player is able to successfully climb to/from some terrain and not slip down.

Returns
whether player has slipped down
Dexterity decreases chances of slipping while climbing

Definition at line 11989 of file game.cpp.

11990{
11991 ///\EFFECT_DEX decreases chances of slipping while climbing
11992 int climb = u.dex_cur;
11993 if( u.has_trait( trait_BADKNEES ) ) {
11994 climb = climb / 2;
11995 }
11996 if( one_in( climb ) ) {
11997 add_msg( m_bad, _( "You slip while climbing and fall down again." ) );
11998 if( climb <= 1 ) {
11999 add_msg( m_bad, _( "Climbing is impossible in your current state." ) );
12000 }
12001 return true;
12002 }
12003 return false;
12004}
static const trait_id trait_BADKNEES("BADKNEES")

References _, add_msg(), Character::dex_cur, Character::has_trait(), m_bad, one_in(), trait_BADKNEES, and u.

◆ spawn_hallucination()

bool game::spawn_hallucination ( const tripoint p)

Spawns a hallucination at a determined position.

Attempts to spawn a hallucination at given location.

Returns false if the hallucination couldn't be spawned for whatever reason, such as a monster already in the target square.

Returns
Whether or not a hallucination was successfully spawned.

Definition at line 4704 of file game.cpp.

4705{
4706 if( one_in( 100 ) ) {
4707 shared_ptr_fast<npc> tmp = make_shared_fast<npc>();
4708 tmp->randomize( NC_HALLU );
4709 tmp->spawn_at_precise( { get_levx(), get_levy() }, p );
4710 if( !critter_at( p, true ) ) {
4712 load_npcs();
4713 return true;
4714 } else {
4715 return false;
4716 }
4717 }
4718
4720 const shared_ptr_fast<monster> phantasm = make_shared_fast<monster>( mt );
4721 phantasm->hallucination = true;
4722 phantasm->spawn( p );
4723
4724 //Don't attempt to place phantasms inside of other creatures
4725 if( !critter_at( phantasm->pos(), true ) ) {
4726 return critter_tracker->add( phantasm );
4727 } else {
4728 return false;
4729 }
4730}
mtype_id get_valid_hallucination() const
static MonsterGenerator & generator()
npc_class_id NC_HALLU("NC_HALLU")

References critter_at(), critter_tracker, MonsterGenerator::generator(), get_levx(), get_levy(), MonsterGenerator::get_valid_hallucination(), overmapbuffer::insert_npc(), load_npcs(), NC_HALLU, one_in(), and overmap_buffer.

◆ spell_events_subscriber()

spell_events & game::spell_events_subscriber ( )

Definition at line 2717 of file game.cpp.

2718{
2719 return *spell_events_ptr;
2720}

References spell_events_ptr.

◆ start_calendar()

void game::start_calendar ( )

Definition at line 11549 of file game.cpp.

11550{
11551 const bool scen_season = scen->has_flag( "SPR_START" ) || scen->has_flag( "SUM_START" ) ||
11552 scen->has_flag( "AUT_START" ) || scen->has_flag( "WIN_START" ) ||
11553 scen->has_flag( "SUM_ADV_START" );
11554
11556 if( scen_season ) {
11557 // Configured starting date overridden by scenario, calendar_config.start is left as Spring 1
11559 get_option<int>( "INITIAL_TIME" );
11560 calendar_config._start_of_game = calendar::turn_zero + 1_hours * get_option<int>( "INITIAL_TIME" );
11561 if( scen->has_flag( "SPR_START" ) ) {
11563 } else if( scen->has_flag( "SUM_START" ) ) {
11566 } else if( scen->has_flag( "AUT_START" ) ) {
11569 } else if( scen->has_flag( "WIN_START" ) ) {
11572 } else if( scen->has_flag( "SUM_ADV_START" ) ) {
11575 } else {
11576 debugmsg( "The Unicorn" );
11577 }
11578 } else {
11579 // No scenario, so use the starting date+time configured in world options
11580 int initial_days = get_option<int>( "INITIAL_DAY" );
11581 if( initial_days == -1 ) {
11582 // 0 - 363 for a 91 day season
11583 initial_days = rng( 0, get_option<int>( "SEASON_LENGTH" ) * 4 - 1 );
11584 }
11586
11587 // Determine the season based off how long the seasons are set to be
11588 // First take the number of season elapsed up to the starting date, then mod by 4 to get the season of the current year
11589 const int season_number = ( initial_days / get_option<int>( "SEASON_LENGTH" ) ) % 4;
11590 if( season_number == 0 ) {
11592 } else if( season_number == 1 ) {
11594 } else if( season_number == 2 ) {
11596 } else {
11598 }
11599
11601 + 1_hours * get_option<int>( "INITIAL_TIME" )
11602 + 1_days * get_option<int>( "SPAWN_DELAY" );
11603 }
11604
11606}
@ WINTER
Definition: calendar.h:21
@ AUTUMN
Definition: calendar.h:20
@ SUMMER
Definition: calendar.h:19
@ SPRING
Definition: calendar.h:18
time_duration season_length() const
Definition: calendar.h:569
const scenario * scen
Definition: game.h:982
bool has_flag(const std::string &flag) const
Such as a seasonal start, fiery start, surrounded start, etc.
Definition: scenario.cpp:439

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, AUTUMN, calendar::config, debugmsg, scenario::has_flag(), rng(), scen, calendar_config::season_length(), SPRING, SUMMER, calendar::turn, calendar::turn_zero, and WINTER.

Referenced by start_game().

◆ start_game()

bool game::start_game ( )
private

Definition at line 554 of file game.cpp.

555{
556 if( !gamemode ) {
557 gamemode = std::make_unique<special_game>();
558 }
559
560 seed = rng_bits();
561 new_game = true;
564 safe_mode = ( get_option<bool>( "SAFEMODE" ) ? SAFE_MODE_ON : SAFE_MODE_OFF );
565 mostseen = 0; // ...and mostseen is 0, we haven't seen any monsters yet.
568
570
573 popup.message( "%s", _( "Please wait as we build your world" ) );
576
577 load_master();
578 u.setID( assign_npc_id() ); // should be as soon as possible, but *after* load_master
579
583 do {
584 omtstart = start_loc.find_player_initial_location();
585 if( omtstart == overmap::invalid_tripoint ) {
586 if( query_yn(
587 _( "Try again?\n\nIt may require several attempts until the game finds a valid starting location." ) ) ) {
590 } else {
591 return false;
592 }
593 }
594 } while( omtstart == overmap::invalid_tripoint );
595
596 start_loc.prepare_map( omtstart );
597
598 // Place vehicles spawned by scenario or profession, has to be placed very early to avoid bugs.
599 if( u.starting_vehicle &&
600 !place_vehicle_nearby( u.starting_vehicle, omtstart.xy(), 0, 30,
601 std::vector<std::string> {} ) ) {
602 debugmsg( "could not place starting vehicle" );
603 }
604
605 if( scen->has_map_extra() ) {
606 // Map extras can add monster spawn points and similar and should be done before the main
607 // map is loaded.
608 start_loc.add_map_extra( omtstart, scen->get_map_extra() );
609 }
610
611 // TODO: fix point types
612 tripoint lev = project_to<coords::sm>( omtstart ).raw();
613 // The player is centered in the map, but lev[xyz] refers to the top left point of the map
614 lev.x -= HALF_MAPSIZE;
615 lev.y -= HALF_MAPSIZE;
616 load_map( lev, /*pump_events=*/true );
617
620 // Do this after the map cache has been built!
621 start_loc.place_player( u );
622 // ...but then rebuild it, because we want visibility cache to avoid spawning monsters in sight
625 // Start the overmap with out immediate neighborhood visible, this needs to be after place_player
627 get_option<int>( "DISTANCE_INITIAL_VISIBILITY" ), 0 );
628
629 u.moves = 0;
630 u.process_turn(); // process_turn adds the initial move points
634 u.next_climate_control_check = calendar::before_time_starts; // Force recheck at startup
636
637 //Reset character safe mode/pickup rules
642
643 //Put some NPCs in there!
644 if( get_option<std::string>( "STARTING_NPC" ) == "always" ||
645 ( get_option<std::string>( "STARTING_NPC" ) == "scenario" &&
646 !g->scen->has_flag( "LONE_START" ) ) ) {
648 }
649 //Load NPCs. Set nearby npcs to active.
650 load_npcs();
651 // Spawn the monsters
652 const bool spawn_near =
653 get_option<bool>( "BLACK_ROAD" ) || g->scen->has_flag( "SUR_START" );
654 // Surrounded start ones
655 if( spawn_near ) {
656 start_loc.surround_with_monsters( omtstart, mongroup_id( "GROUP_ZOMBIE" ), 70 );
657 }
658
659 m.spawn_monsters( !spawn_near ); // Static monsters
660
661 // Make sure that no monsters are near the player
662 // This can happen in lab starts
663 if( !spawn_near ) {
664 for( monster &critter : all_monsters() ) {
665 if( rl_dist( critter.pos(), u.pos() ) <= 5 ||
666 m.clear_path( critter.pos(), u.pos(), 40, 1, 100 ) ) {
667 remove_zombie( critter );
668 }
669 }
670 }
671
672 //Create mutation_category_level
674 //Calculate mutation drench protection stats
677 if( scen->has_flag( "FIRE_START" ) ) {
678 start_loc.burn( omtstart, 3, 3 );
679 }
680 if( scen->has_flag( "INFECTED" ) ) {
682 }
683 if( scen->has_flag( "BAD_DAY" ) ) {
684 u.add_effect( effect_flu, 1000_minutes );
685 u.add_effect( effect_drunk, 270_minutes );
686 u.add_morale( MORALE_FEELING_BAD, -100, -100, 50_minutes, 50_minutes );
687 }
688 if( scen->has_flag( "HELI_CRASH" ) ) {
689 start_loc.handle_heli_crash( u );
690 bool success = false;
691 for( auto v : m.get_vehicles() ) {
692 std::string name = v.v->type.str();
693 std::string search = std::string( "helicopter" );
694 if( name.find( search ) != std::string::npos ) {
695 for( const vpart_reference &vp : v.v->get_any_parts( VPFLAG_CONTROLS ) ) {
696 const tripoint pos = vp.pos();
697 u.setpos( pos );
698
699 // Delete the items that would have spawned here from a "corpse"
700 for( auto sp : v.v->parts_at_relative( vp.mount(), true ) ) {
701 vehicle_stack here = v.v->get_items( sp );
702
703 for( auto iter = here.begin(); iter != here.end(); ) {
704 iter = here.erase( iter );
705 }
706 }
707
708 auto mons = critter_tracker->find( pos );
709 if( mons != nullptr ) {
710 critter_tracker->remove( *mons );
711 }
712
713 success = true;
714 break;
715 }
716 if( success ) {
717 v.v->name = "Bird Wreckage";
718 break;
719 }
720 }
721 }
722 }
723 if( scen->has_flag( "BORDERED" ) ) {
724 overmap &starting_om = get_cur_om();
725 for( int z = -OVERMAP_DEPTH; z <= OVERMAP_HEIGHT; z++ ) {
726 starting_om.place_special_forced( overmap_special_id( "world" ), { 0, 0, z },
728 }
729
730 }
731 for( auto &e : u.inv_dump() ) {
732 e->set_owner( g->u );
733 }
734 // Now that we're done handling coordinates, ensure the player's submap is in the center of the map
735 update_map( u );
736 // Profession pets
737 for( const mtype_id &elem : u.starting_pets ) {
738 if( monster *const mon = place_critter_around( elem, u.pos(), 5 ) ) {
739 mon->friendly = -1;
740 mon->add_effect( effect_pet, 1_turns, num_bp );
741 } else {
742 add_msg( m_debug, "cannot place starting pet, no space!" );
743 }
744 }
745 // Assign all of this scenario's missions to the player.
746 for( const mission_type_id &m : scen->missions() ) {
747 const auto mission = mission::reserve_new( m, character_id() );
748 mission->assign( u );
749 }
750
751 g->events().send<event_type::game_start>( u.getID() );
752 return true;
753}
body_part random_body_part(bool main_parts_only)
Returns a random body_part token.
Definition: bodypart.cpp:364
bool last_climate_control_ret
Definition: character.h:2263
void drench_mut_calc()
Recalculates mutation drench protection for all bodyparts (ignored/good/neutral stats)
Definition: character.cpp:7773
void set_stamina(int new_stamina)
Definition: character.cpp:7064
time_point next_climate_control_check
Definition: character.h:2262
int get_stamina_max() const
Definition: character.cpp:7053
void set_highest_cat_level()
Recalculates mutation_category_level[] values for the player.
Definition: character.cpp:7750
void default_initialize()
Perform default initialization.
Definition: auto_note.cpp:101
void start_calendar()
Definition: game.cpp:11549
void create_starting_npcs()
Definition: game.cpp:881
overmap & get_cur_om() const
The overmap which contains the center submap of the reality bubble.
Definition: game.cpp:11849
vehicle * place_vehicle_nearby(const vproto_id &id, const point_abs_omt &origin, int min_distance, int max_distance, const std::vector< std::string > &omt_search_types={})
Definition: game.cpp:755
bool clear_path(const tripoint &f, const tripoint &t, int range, int cost_min, int cost_max) const
Check whether there's a direct line of sight between F and T with the additional movecost restraints.
Definition: map.cpp:6468
static mission * reserve_new(const mission_type_id &type, const character_id &npc_id)
Create a new mission of the given type and assign it to the given npc.
Definition: mission.cpp:64
void assign(avatar &u)
Assigns the mission to the player.
Definition: mission.cpp:210
void place_special_forced(const overmap_special_id &special_id, const tripoint_om_omt &p, om_direction::type dir)
Definition: overmap.cpp:2164
bool reveal(const point_abs_omt &center, int radius, int z)
Mark a square area around center on Z-level z as seen.
bool random_start_location
Definition: player.h:238
vproto_id starting_vehicle
Definition: player.h:250
std::vector< mtype_id > starting_pets
Definition: player.h:251
start_location_id start_location
Definition: player.h:239
void clear_character_rules()
bool has_map_extra() const
Definition: scenario.cpp:454
const std::string & get_map_extra() const
Definition: scenario.cpp:458
const std::vector< mission_type_id > & missions() const
Definition: scenario.cpp:462
start_location_id random_start_location() const
Definition: scenario.cpp:232
void burn(const tripoint_abs_omt &omtstart, size_t count, int rad) const
Burn random terrain / furniture with FLAMMABLE or FLAMMABLE_ASH tag.
void surround_with_monsters(const tripoint_abs_omt &omtstart, const mongroup_id &type, float expected_points) const
Adds surround start monsters.
void prepare_map(const tripoint_abs_omt &omtstart) const
Initialize the map at players start location using prepare_map.
void place_player(player &u) const
Place the player somewhere in the reality bubble (g->m).
void handle_heli_crash(player &u) const
tripoint_abs_omt find_player_initial_location() const
Find a suitable start location on the overmap.
void add_map_extra(const tripoint_abs_omt &omtstart, const std::string &map_extra) const
Adds a map extra, see map_extras.h and map_extras.cpp.
const T & obj() const
Returns the actual object this id refers to.
Definition: achievement.cpp:58
iterator erase(const_iterator it) override
Definition: vehicle.cpp:231
static const efftype_id effect_drunk("drunk")
static const efftype_id effect_infected("infected")
static const efftype_id effect_accumulated_mutagen("accumulated_mutagen")
static const efftype_id effect_flu("flu")
static constexpr int SPRING_TEMPERATURE
Base starting spring temperature in F used for climate, weather and temperature calculation.
void update_weather()
Definition: weather.cpp:1056
const morale_type MORALE_FEELING_BAD("morale_feeling_bad")
static bool search(const ui_adaptor &om_ui, tripoint_abs_omt &curs, const tripoint_abs_omt &orig)
unsigned int rng_bits()
Definition: rng.cpp:12
string_id< overmap_special > overmap_special_id
Definition: type_id.h:134
string_id< MonsterGroup > mongroup_id
Definition: type_id.h:105
@ VPFLAG_CONTROLS
Definition: veh_type.h:41

References _, Creature::add_effect(), start_location::add_map_extra(), Character::add_morale(), add_msg(), all_monsters(), mission::assign(), assign_npc_id(), calendar::before_time_starts, item_stack::begin(), map::build_map_cache(), start_location::burn(), character_id, auto_notes::auto_note_settings::clear(), overmapbuffer::clear(), auto_pickup::player_settings::clear_character_rules(), safemode::clear_character_rules(), map::clear_path(), create_starting_npcs(), critter_tracker, debugmsg, auto_notes::auto_note_settings::default_initialize(), Character::drench_mut_calc(), effect_accumulated_mutagen, effect_drunk, effect_flu, effect_infected, effect_pet, item_stack::end(), vehicle_stack::erase(), start_location::find_player_initial_location(), g, game_start, gamemode, get_auto_notes_settings(), get_auto_pickup(), get_cur_om(), get_distraction_manager(), get_levz(), scenario::get_map_extra(), get_safemode(), Character::get_stamina_max(), map::get_vehicles(), get_weather, Character::getID(), Character::global_omt_location(), HALF_MAPSIZE, start_location::handle_heli_crash(), scenario::has_flag(), scenario::has_map_extra(), init_autosave(), Character::inv_dump(), overmap::invalid_tripoint, map::invalidate_map_cache(), Character::last_climate_control_ret, distraction_manager::distraction_manager_gui::load(), safemode::load_global(), load_map(), load_master(), load_npcs(), m, m_debug, MAPBUFFER, scenario::missions(), MORALE_FEELING_BAD, mostseen, Creature::moves, om_direction::name(), new_game, Character::next_climate_control_check, weather_manager::nextweather, om_direction::north, num_bp, string_id< T >::obj(), overmap_buffer, OVERMAP_DEPTH, OVERMAP_HEIGHT, place_critter_around(), start_location::place_player(), overmap::place_special_forced(), place_vehicle_nearby(), popup(), Character::pos(), start_location::prepare_map(), Character::process_turn(), query_yn(), random_body_part(), player::random_start_location, scenario::random_start_location(), ui_manager::redraw(), refresh_display(), remove_zombie(), mission::reserve_new(), mapbuffer::reset(), overmapbuffer::reveal(), rl_dist(), rng_bits(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, scen, overmap_ui::search(), seed, Character::set_highest_cat_level(), Character::set_stamina(), Character::setID(), Character::setpos(), map::spawn_monsters(), SPRING_TEMPERATURE, start_calendar(), player::start_location, player::starting_pets, player::starting_vehicle, behavior::success, start_location::surround_with_monsters(), weather_manager::temperature, calendar::turn, u, update_map(), weather_manager::update_weather(), VPFLAG_CONTROLS, tripoint::x, coords::coord_point< Point, Origin, Scale >::xy(), and tripoint::y.

◆ start_hauling()

void game::start_hauling ( const tripoint pos)

Definition at line 10349 of file game.cpp.

10350{
10351 // Find target items and quantities thereof for the new activity
10352 std::vector<item_location> target_items;
10353 std::vector<int> quantities;
10354
10355 map_stack items = m.i_at( pos );
10356 for( item &it : items ) {
10357 // Liquid cannot be picked up
10358 if( it.made_of( LIQUID ) ) {
10359 continue;
10360 }
10361 target_items.emplace_back( map_cursor( pos ), &it );
10362 // Quantity of 0 means move all
10363 quantities.push_back( 0 );
10364 }
10365
10366 if( target_items.empty() ) {
10367 // Nothing to haul
10368 return;
10369 }
10370
10371 // Whether the destination is inside a vehicle (not supported)
10372 const bool to_vehicle = false;
10373 // Destination relative to the player
10374 const tripoint relative_destination{};
10375
10377 target_items,
10378 quantities,
10379 to_vehicle,
10380 relative_destination
10381 ) ) );
10382}

References Character::assign_activity(), map::i_at(), LIQUID, m, and u.

Referenced by vertical_move(), and walk_move().

◆ stats()

stats_tracker & game::stats ( )

Definition at line 2707 of file game.cpp.

2708{
2709 return *stats_tracker_ptr;
2710}

References stats_tracker_ptr.

Referenced by death_screen(), handle_action(), setup(), and win().

◆ swap_critters()

bool game::swap_critters ( Creature a,
Creature b 
)

Swaps positions of two creatures.

Definition at line 4732 of file game.cpp.

4733{
4734 if( &a == &b ) {
4735 // No need to do anything, but print a debugmsg anyway
4736 debugmsg( "Tried to swap %s with itself", a.disp_name() );
4737 return true;
4738 }
4739 if( critter_at( a.pos() ) != &a ) {
4740 debugmsg( "Tried to swap when it would cause a collision between %s and %s.",
4741 b.disp_name(), critter_at( a.pos() )->disp_name() );
4742 return false;
4743 }
4744 if( critter_at( b.pos() ) != &b ) {
4745 debugmsg( "Tried to swap when it would cause a collision between %s and %s.",
4746 a.disp_name(), critter_at( b.pos() )->disp_name() );
4747 return false;
4748 }
4749 // Simplify by "sorting" the arguments
4750 // Only the first argument can be u
4751 // If swapping player/npc with a monster, monster is second
4752 bool a_first = a.is_player() ||
4753 ( a.is_npc() && !b.is_player() );
4754 Creature &first = a_first ? a : b;
4755 Creature &second = a_first ? b : a;
4756 // Possible options:
4757 // both first and second are monsters
4758 // second is a monster, first is a player or an npc
4759 // first is a player, second is an npc
4760 // both first and second are npcs
4761 if( first.is_monster() ) {
4762 monster *m1 = dynamic_cast< monster * >( &first );
4763 monster *m2 = dynamic_cast< monster * >( &second );
4764 if( m1 == nullptr || m2 == nullptr || m1 == m2 ) {
4765 debugmsg( "Couldn't swap two monsters" );
4766 return false;
4767 }
4768
4769 critter_tracker->swap_positions( *m1, *m2 );
4770 return true;
4771 }
4772
4773 player *u_or_npc = dynamic_cast< player * >( &first );
4774 player *other_npc = dynamic_cast< player * >( &second );
4775
4776 if( u_or_npc->in_vehicle ) {
4777 m.unboard_vehicle( u_or_npc->pos() );
4778 }
4779
4780 if( other_npc && other_npc->in_vehicle ) {
4781 m.unboard_vehicle( other_npc->pos() );
4782 }
4783
4784 tripoint temp = second.pos();
4785 second.setpos( first.pos() );
4786
4787 if( first.is_player() ) {
4788 walk_move( temp );
4789 } else {
4790 first.setpos( temp );
4791 if( m.veh_at( u_or_npc->pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) ) {
4792 m.board_vehicle( u_or_npc->pos(), u_or_npc );
4793 }
4794 }
4795
4796 if( other_npc && m.veh_at( other_npc->pos() ).part_with_feature( VPFLAG_BOARDABLE, true ) ) {
4797 m.board_vehicle( other_npc->pos(), other_npc );
4798 }
4799 return true;
4800}
virtual bool is_monster() const
Definition: creature.h:101
virtual bool is_player() const
Definition: creature.h:92
virtual void setpos(const tripoint &pos)=0
bool walk_move(const tripoint &dest, bool via_ramp=false)
Definition: game.cpp:8728
constexpr double a
Definition: magic.cpp:1030
constexpr double b
Definition: magic.cpp:1031
@ VPFLAG_BOARDABLE
Definition: veh_type.h:39

References a, b, map::board_vehicle(), critter_at(), critter_tracker, debugmsg, Character::in_vehicle, Creature::is_monster(), Creature::is_player(), m, optional_vpart_position::part_with_feature(), Creature::pos(), Character::pos(), second, Creature::setpos(), map::unboard_vehicle(), map::veh_at(), VPFLAG_BOARDABLE, and walk_move().

Referenced by npc_menu().

◆ take_screenshot() [1/2]

bool game::take_screenshot ( ) const

Saves a screenshot of the current viewport, as a PNG file.

Filesystem location is derived from the current world and character.

Note
: Only works for SDL/TILES (otherwise the function returns false). A window (more precisely, a viewport) must already exist and the SDL renderer must be valid.
Returns
true if the screenshot generation was successful, false otherwise.

Definition at line 7114 of file game.cpp.

7115{
7116 popup( _( "This binary was not compiled with tiles support." ) );
7117 return false;
7118}

References _, and popup().

Referenced by do_turn().

◆ take_screenshot() [2/2]

bool game::take_screenshot ( const std::string &  file_path) const

Saves a screenshot of the current viewport, as a PNG file, to the given location.

Parameters
file_pathA full path to the file where the screenshot should be saved.
Note
: Only works for SDL/TILES (otherwise the function returns false). A window (more precisely, a viewport) must already exist and the SDL renderer must be valid.
Returns
true if the screenshot generation was successful, false otherwise.

Definition at line 7108 of file game.cpp.

7109{
7110 popup( _( "This binary was not compiled with tiles support." ) );
7111 return false;
7112}

References _, and popup().

◆ temp_exit_fullscreen()

void game::temp_exit_fullscreen ( )

Definition at line 453 of file game.cpp.

454{
455 if( fullscreen ) {
456 was_fullscreen = true;
458 } else {
459 was_fullscreen = false;
460 }
461}

References fullscreen, toggle_fullscreen(), and was_fullscreen.

Referenced by list_items_monsters(), and look_around().

◆ toggle_debug_hour_timer()

void game::toggle_debug_hour_timer ( )

Definition at line 11156 of file game.cpp.

11157{
11159}

References game::debug_hour_timer::toggle().

Referenced by handle_action(), and look_around().

◆ toggle_fullscreen()

void game::toggle_fullscreen ( )

Definition at line 406 of file game.cpp.

407{
408#if !defined(TILES)
411#else
412 toggle_fullscreen_window();
413#endif
414}

References fullscreen, and mark_main_ui_adaptor_resize().

Referenced by handle_action(), reenter_fullscreen(), and temp_exit_fullscreen().

◆ toggle_gate()

void game::toggle_gate ( const tripoint p)

Definition at line 5101 of file game.cpp.

5102{
5103 gates::toggle_gate( p, u );
5104}
void toggle_gate(const tripoint &pos, player &p)
opens/closes the gate via player's activity
Definition: gates.cpp:236

References gates::toggle_gate(), and u.

◆ toggle_pixel_minimap()

void game::toggle_pixel_minimap ( )

Definition at line 416 of file game.cpp.

417{
418#if defined(TILES)
420 clear_window_area( w_pixel_minimap );
421 }
424#endif // TILES
425}

References mark_main_ui_adaptor_resize(), pixel_minimap_option, and w_pixel_minimap.

Referenced by handle_action(), and look_around().

◆ try_get_left_click_action()

bool game::try_get_left_click_action ( action_id act,
const tripoint mouse_target 
)
private

Definition at line 2292 of file game.cpp.

2293{
2294 bool new_destination = true;
2295 if( !destination_preview.empty() ) {
2296 auto &final_destination = destination_preview.back();
2297 if( final_destination.x == mouse_target.x && final_destination.y == mouse_target.y ) {
2298 // Second click
2299 new_destination = false;
2301 destination_preview.clear();
2303 if( act == ACTION_NULL ) {
2304 // Something went wrong
2306 return false;
2307 }
2308 }
2309 }
2310
2311 if( new_destination ) {
2313 u.get_path_avoid() );
2314 return false;
2315 }
2316
2317 return true;
2318}

References act, ACTION_NULL, Character::clear_destination(), destination_preview, Character::get_next_auto_move_direction(), Character::get_path_avoid(), Character::get_pathfinding_settings(), m, Character::pos(), map::route(), Character::set_destination(), u, tripoint::x, and tripoint::y.

Referenced by handle_action().

◆ try_get_right_click_action()

bool game::try_get_right_click_action ( action_id act,
const tripoint mouse_target 
)
private

Definition at line 2320 of file game.cpp.

2321{
2322 const bool cleared_destination = !destination_preview.empty();
2324 destination_preview.clear();
2325
2326 if( cleared_destination ) {
2327 // Produce no-op if auto-move had just been cleared on this action
2328 // e.g. from a previous single left mouse click. This has the effect
2329 // of right-click canceling an auto-move before it is initiated.
2330 return false;
2331 }
2332
2333 const bool is_adjacent = square_dist( mouse_target.xy(), point( u.posx(), u.posy() ) ) <= 1;
2334 const bool is_self = square_dist( mouse_target.xy(), point( u.posx(), u.posy() ) ) <= 0;
2335 if( const monster *const mon = critter_at<monster>( mouse_target ) ) {
2336 if( !u.sees( *mon ) ) {
2337 add_msg( _( "Nothing relevant here." ) );
2338 return false;
2339 }
2340
2341 if( !u.weapon.is_gun() ) {
2342 add_msg( m_info, _( "You are not wielding a ranged weapon." ) );
2343 return false;
2344 }
2345
2346 // TODO: Add weapon range check. This requires weapon to be reloaded.
2347
2348 act = ACTION_FIRE;
2349 } else if( is_adjacent &&
2350 m.close_door( tripoint( mouse_target.xy(), u.posz() ), !m.is_outside( u.pos() ),
2351 true ) ) {
2352 act = ACTION_CLOSE;
2353 } else if( is_self ) {
2355 } else if( is_adjacent ) {
2357 } else {
2358 add_msg( _( "Nothing relevant here." ) );
2359 return false;
2360 }
2361
2362 return true;
2363}
bool close_door(const tripoint &p, bool inside, bool check_only)
Definition: map.cpp:4033
static bool is_adjacent(const monster &z, const Creature &target)

References _, act, ACTION_CLOSE, ACTION_EXAMINE, ACTION_FIRE, ACTION_PICKUP, add_msg(), Character::clear_destination(), map::close_door(), destination_preview, is_adjacent(), item::is_gun(), map::is_outside(), m, m_info, Character::pos(), Character::posx(), Character::posy(), Character::posz(), Character::sees(), square_dist(), u, Character::weapon, and tripoint::xy().

Referenced by handle_action().

◆ unload_npcs()

void game::unload_npcs ( )
private

Unloads all NPCs.

If you call this you must later call load_npcs, lest caches get rather confused. The tests used to call this a lot when they shouldn't. It is now private to reduce the chance of similar problems in the future.

Definition at line 859 of file game.cpp.

860{
861 for( const auto &npc : active_npc ) {
862 npc->on_unload();
863 }
864
865 active_npc.clear();
866}
void on_unload()
Do some cleanup and caching as npc is being unloaded from map.
Definition: npc.cpp:2665

References active_npc, and npc::on_unload().

Referenced by place_player_overmap(), and reload_npcs().

◆ unserialize()

void game::unserialize ( std::istream &  fin)

Definition at line 167 of file savegame.cpp.

168{
169 chkversion( fin );
170 int tmpturn = 0;
171 int tmpcalstart = 0;
172 int tmprun = 0;
173 tripoint lev;
174 point com;
175 JsonIn jsin( fin );
176 try {
177 JsonObject data = jsin.get_object();
178
179 data.read( "turn", tmpturn );
180 data.read( "calendar_start", tmpcalstart );
182 calendar_config._initial_season = static_cast<season_type>( data.get_int( "initial_season",
183 static_cast<int>( SPRING ) ) );
184 // 0.E stable
185 if( savegame_loading_version < 26 ) {
186 tmpturn *= 6;
187 tmpcalstart *= 6;
188 }
191 tmpcalstart );
192
193 if( !data.read( "game_start", calendar_config._start_of_game ) ) {
195 }
196
197 data.read( "auto_travel_mode", auto_travel_mode );
198 data.read( "run_mode", tmprun );
199 data.read( "mostseen", mostseen );
200 data.read( "levx", lev.x );
201 data.read( "levy", lev.y );
202 data.read( "levz", lev.z );
203 data.read( "om_x", com.x );
204 data.read( "om_y", com.y );
205
206 load_map(
207 tripoint( lev.x + com.x * OMAPX * 2, lev.y + com.y * OMAPY * 2, lev.z ),
208 /*pump_events=*/true
209 );
210
211 safe_mode = static_cast<safe_mode_type>( tmprun );
212 if( get_option<bool>( "SAFEMODE" ) && safe_mode == SAFE_MODE_OFF ) {
214 }
215
216 std::string linebuff;
217 std::string linebuf;
218 if( data.read( "grscent", linebuf ) && data.read( "typescent", linebuff ) ) {
219 scent.deserialize( linebuf );
220 scent.deserialize( linebuff, true );
221 } else {
222 scent.reset();
223 }
224 data.read( "active_monsters", *critter_tracker );
225
226 coming_to_stairs.clear();
227 for( auto elem : data.get_array( "stair_monsters" ) ) {
228 monster stairtmp;
229 elem.read( stairtmp );
230 coming_to_stairs.push_back( stairtmp );
231 }
232
233 if( data.has_object( "kill_tracker" ) ) {
234 data.read( "kill_tracker", *kill_tracker_ptr );
235 } else {
236 // Legacy support for when kills were stored directly in game
237 std::map<mtype_id, int> kills;
238 std::vector<std::string> npc_kills;
239 for( const JsonMember member : data.get_object( "kills" ) ) {
240 kills[mtype_id( member.name() )] = member.get_int();
241 }
242
243 for( const std::string npc_name : data.get_array( "npc_kills" ) ) {
244 npc_kills.push_back( npc_name );
245 }
246
247 kill_tracker_ptr->reset( kills, npc_kills );
248 }
249
250 data.read( "player", u );
252 data.read( "stats_tracker", *stats_tracker_ptr );
253 data.read( "achievements_tracker", *achievements_tracker_ptr );
254 data.read( "token_provider", token_provider_ptr );
256 Messages::deserialize( data );
257
258 } catch( const JsonError &jsonerr ) {
259 debugmsg( "Bad save json\n%s", jsonerr.c_str() );
260 return;
261 }
262}
season_type
Real world seasons.
Definition: calendar.h:17
Represents a member of a JsonObject.
Definition: json.h:1250
JsonObject get_object(const std::string &name) const
Definition: json.cpp:428
bool has_object(const std::string &name) const
Definition: json.cpp:492
JsonArray get_array(const std::string &name) const
Definition: json.cpp:399
int get_int(const std::string &name) const
Definition: json.cpp:349
bool read(const std::string &name, T &t, bool throw_on_error=true) const
Definition: json.h:942
void deserialize(const std::string &data, bool is_type=false)
Definition: savegame.cpp:264
safe_mode_type
Definition: game.h:76
static constexpr int OMAPY
static constexpr int OMAPX
Size of the overmap.
void deserialize(const JsonObject &json)
Definition: messages.cpp:330
std::string member
Definition: mapgen.cpp:410
static void chkversion(std::istream &fin)
Definition: savegame.cpp:148
int savegame_loading_version
Definition: savegame.cpp:64

References calendar_config::_initial_season, calendar_config::_start_of_cataclysm, calendar_config::_start_of_game, achievements_tracker_ptr, auto_travel_mode, JsonError::c_str(), chkversion(), coming_to_stairs, calendar::config, critter_tracker, debugmsg, Messages::deserialize(), scent_map::deserialize(), time_duration::from_turns(), JsonObject::get_array(), JsonObject::get_int(), JsonIn::get_object(), JsonObject::get_object(), JsonObject::has_object(), inp_mngr, kill_tracker_ptr, load_map(), mapgen_defer::member, mostseen, mtype_id, OMAPX, OMAPY, input_manager::pump_events(), JsonObject::read(), scent_map::reset(), safe_mode, SAFE_MODE_OFF, SAFE_MODE_ON, savegame_loading_version, scent, SPRING, stats_tracker_ptr, token_provider_ptr, calendar::turn, calendar::turn_zero, u, point::x, tripoint::x, point::y, tripoint::y, and tripoint::z.

Referenced by load().

◆ unserialize_master()

void game::unserialize_master ( std::istream &  fin)

Definition at line 1193 of file savegame.cpp.

1194{
1196 chkversion( fin );
1197 if( savegame_loading_version < 11 ) {
1198 std::unique_ptr<static_popup>popup = std::make_unique<static_popup>();
1199 popup->message(
1200 _( "Cannot find loader for save data in old version %d, attempting to load as current version %d." ),
1204 }
1205 try {
1206 // single-pass parsing example
1207 JsonIn jsin( fin );
1208 jsin.start_object();
1209 while( !jsin.end_object() ) {
1210 std::string name = jsin.get_member_name();
1211 if( name == "next_mission_id" ) {
1212 next_mission_id = jsin.get_int();
1213 } else if( name == "next_npc_id" ) {
1214 next_npc_id.deserialize( jsin );
1215 } else if( name == "active_missions" ) {
1217 } else if( name == "factions" ) {
1218 jsin.read( *faction_manager_ptr );
1219 } else if( name == "seed" ) {
1220 jsin.read( seed );
1221 } else if( name == "weather" ) {
1222 JsonObject w = jsin.get_object();
1223 w.read( "lightning", get_weather().lightning_active );
1224 } else {
1225 // silently ignore anything else
1226 jsin.skip_value();
1227 }
1228 }
1229 } catch( const JsonError &e ) {
1230 debugmsg( "error loading %s: %s", SAVE_MASTER, e.c_str() );
1231 }
1232}
void deserialize(JsonIn &)
static void unserialize_all(JsonIn &jsin)
Definition: savegame.cpp:1183

References _, JsonError::c_str(), chkversion(), debugmsg, character_id::deserialize(), JsonIn::end_object(), faction_manager_ptr, JsonIn::get_int(), JsonIn::get_member_name(), JsonIn::get_object(), get_weather, om_direction::name(), next_mission_id, next_npc_id, popup(), JsonIn::read(), JsonObject::read(), ui_manager::redraw(), refresh_display(), SAVE_MASTER(), savegame_loading_version, savegame_version, seed, JsonIn::skip_value(), JsonIn::start_object(), and mission::unserialize_all().

Referenced by load_master().

◆ update_map() [1/2]

point game::update_map ( int &  x,
int &  y 
)

Definition at line 10617 of file game.cpp.

10618{
10619 point shift;
10620
10621 while( x < HALF_MAPSIZE_X ) {
10622 x += SEEX;
10623 shift.x--;
10624 }
10625 while( x >= HALF_MAPSIZE_X + SEEX ) {
10626 x -= SEEX;
10627 shift.x++;
10628 }
10629 while( y < HALF_MAPSIZE_Y ) {
10630 y += SEEY;
10631 shift.y--;
10632 }
10633 while( y >= HALF_MAPSIZE_Y + SEEY ) {
10634 y -= SEEY;
10635 shift.y++;
10636 }
10637
10638 if( shift == point_zero ) {
10639 // adjust player position
10640 u.setpos( tripoint( x, y, get_levz() ) );
10641 // Update what parts of the world map we can see
10642 // We need this call because even if the map hasn't shifted we may have changed z-level and can now see farther
10643 // TODO: only make this call if we changed z-level
10645 // Not actually shifting the submaps, all the stuff below would do nothing
10646 return point_zero;
10647 }
10648
10649 // this handles loading/unloading submaps that have scrolled on or off the viewport
10650 // NOLINTNEXTLINE(cata-use-named-point-constants)
10651 inclusive_rectangle<point> size_1( point( -1, -1 ), point( 1, 1 ) );
10652 point remaining_shift = shift;
10653 while( remaining_shift != point_zero ) {
10654 point this_shift = clamp( remaining_shift, size_1 );
10655 m.shift( this_shift );
10656 remaining_shift -= this_shift;
10657 }
10658
10659 grid_tracker_ptr->load( m );
10660
10661 // Shift monsters
10662 shift_monsters( tripoint( shift, 0 ) );
10663 const point shift_ms = sm_to_ms_copy( shift );
10664 u.shift_destination( -shift_ms );
10665
10666 // Shift NPCs
10667 for( auto it = active_npc.begin(); it != active_npc.end(); ) {
10668 ( *it )->shift( shift );
10669 if( ( *it )->posx() < 0 - SEEX * 2 || ( *it )->posy() < 0 - SEEX * 2 ||
10670 ( *it )->posx() > SEEX * ( MAPSIZE + 2 ) || ( *it )->posy() > SEEY * ( MAPSIZE + 2 ) ) {
10671 //Remove the npc from the active list. It remains in the overmap list.
10672 ( *it )->on_unload();
10673 it = active_npc.erase( it );
10674 } else {
10675 it++;
10676 }
10677 }
10678
10679 scent.shift( shift_ms );
10680
10681 // Also ensure the player is on current z-level
10682 // get_levz() should later be removed, when there is no longer such a thing
10683 // as "current z-level"
10684 u.setpos( tripoint( x, y, get_levz() ) );
10685
10686 // Only do the loading after all coordinates have been shifted.
10687
10688 // Check for overmap saved npcs that should now come into view.
10689 // Put those in the active list.
10690 load_npcs();
10691
10692 // Make sure map cache is consistent since it may have shifted.
10693 if( m.has_zlevels() ) {
10694 for( int zlev = -OVERMAP_DEPTH; zlev <= OVERMAP_HEIGHT; ++zlev ) {
10695 m.invalidate_map_cache( zlev );
10696 }
10697 } else {
10699 }
10701
10702 // Spawn monsters if appropriate
10703 // This call will generate new monsters in addition to loading, so it's placed after NPC loading
10704 m.spawn_monsters( false ); // Static monsters
10705
10706 // Update what parts of the world map we can see
10708
10709 return shift;
10710}
void shift_destination(const point &shift)
void shift_monsters(const tripoint &shift)
Shift all active monsters, the shift vector is the number of shifted submaps.
Definition: game.cpp:10986
void shift(const point &s)
Shift the map along the vector s.
Definition: map.cpp:6840
void shift(const point &sm_shift)
Definition: scent_map.cpp:82
point sm_to_ms_copy(const point &p)
static constexpr int HALF_MAPSIZE_Y
static constexpr int HALF_MAPSIZE_X

References active_npc, map::build_map_cache(), clamp(), get_levz(), grid_tracker_ptr, HALF_MAPSIZE_X, HALF_MAPSIZE_Y, map::has_zlevels(), map::invalidate_map_cache(), load_npcs(), m, MAPSIZE, OVERMAP_DEPTH, OVERMAP_HEIGHT, point_zero, scent, SEEX, SEEY, Character::setpos(), map::shift(), scent_map::shift(), Character::shift_destination(), shift_monsters(), sm_to_ms_copy(), map::spawn_monsters(), u, update_overmap_seen(), point::x, and point::y.

◆ update_map() [2/2]

point game::update_map ( player p)

Definition at line 10611 of file game.cpp.

10612{
10613 point p2( p.posx(), p.posy() );
10614 return update_map( p2.x, p2.y );
10615}

References Character::posx(), Character::posy(), update_map(), point::x, and point::y.

Referenced by fling_creature(), load(), place_player(), start_game(), update_map(), and vertical_move().

◆ update_overmap_seen()

void game::update_overmap_seen ( )

Definition at line 10712 of file game.cpp.

10713{
10714 const tripoint_abs_omt ompos = u.global_omt_location();
10715 const int dist = u.overmap_sight_range( light_level( u.posz() ) );
10716 const int dist_squared = dist * dist;
10717 // We can always see where we're standing
10718 overmap_buffer.set_seen( ompos, true );
10719 for( const tripoint_abs_omt &p : points_in_radius( ompos, dist ) ) {
10720 const point_rel_omt delta = p.xy() - ompos.xy();
10721 const int h_squared = delta.x() * delta.x() + delta.y() * delta.y();
10722 if( trigdist && h_squared > dist_squared ) {
10723 continue;
10724 }
10725 if( delta == point_rel_omt() ) {
10726 // 1. This case is already handled outside of the loop
10727 // 2. Calculating multiplier would cause division by zero
10728 continue;
10729 }
10730 // If circular distances are enabled, scale overmap distances by the diagonality of the sight line.
10731 point abs_delta = delta.raw().abs();
10732 int max_delta = std::max( abs_delta.x, abs_delta.y );
10733 const float multiplier = trigdist ? std::sqrt( h_squared ) / max_delta : 1;
10734 const std::vector<tripoint_abs_omt> line = line_to( ompos, p );
10735 float sight_points = dist;
10736 for( auto it = line.begin();
10737 it != line.end() && sight_points >= 0; ++it ) {
10738 const oter_id &ter = overmap_buffer.ter( *it );
10739 sight_points -= static_cast<int>( ter->get_see_cost() ) * multiplier;
10740 }
10741 if( sight_points >= 0 ) {
10742 tripoint_abs_omt seen( p );
10743 do {
10744 overmap_buffer.set_seen( seen, true );
10745 --seen.z();
10746 } while( seen.z() >= 0 );
10747 }
10748 }
10749}
bool trigdist
Circular distances.
int overmap_sight_range(int light_level) const
Returns the distance the player can see on the overmap.
Definition: character.cpp:644
constexpr Point & raw()
Definition: coordinates.h:111
void set_seen(const tripoint_abs_omt &p, bool seen=true)
coords::coord_point< point, coords::origin::relative, coords::omt > point_rel_omt
Definition: coordinates.h:478
tripoint_range< Tripoint > points_in_radius(const Tripoint &center, const int radius, const int radiusz=0)
Definition: map_iterator.h:125
unsigned char get_see_cost() const
Definition: omdata.h:230

References oter_t::get_see_cost(), Character::global_omt_location(), light_level(), line(), line_to(), overmap_buffer, Character::overmap_sight_range(), points_in_radius(), Character::posz(), coords::coord_point< Point, Origin, Scale >::raw(), overmapbuffer::set_seen(), overmapbuffer::ter(), trigdist, u, coords::coord_point< Point, Origin, Scale >::x(), point::x, coords::coord_point< Point, Origin, Scale >::xy(), coords::coord_point< Point, Origin, Scale >::y(), point::y, and coords::coord_point< Point, Origin, Scale >::z().

Referenced by place_player_overmap(), and update_map().

◆ update_stair_monsters()

void game::update_stair_monsters ( )
private
Dodge reduces chance of being downed when pushed off the stairs

Definition at line 10764 of file game.cpp.

10765{
10766 // Search for the stairs closest to the player.
10767 std::vector<int> stairx;
10768 std::vector<int> stairy;
10769 std::vector<int> stairdist;
10770
10771 const bool from_below = monstairz < get_levz();
10772
10773 if( coming_to_stairs.empty() ) {
10774 return;
10775 }
10776
10777 if( m.has_zlevels() ) {
10778 debugmsg( "%d monsters coming to stairs on a map with z-levels",
10779 coming_to_stairs.size() );
10780 coming_to_stairs.clear();
10781 }
10782
10783 for( const tripoint &dest : m.points_on_zlevel( u.posz() ) ) {
10784 if( ( from_below && m.has_flag( "GOES_DOWN", dest ) ) ||
10785 ( !from_below && m.has_flag( "GOES_UP", dest ) ) ) {
10786 stairx.push_back( dest.x );
10787 stairy.push_back( dest.y );
10788 stairdist.push_back( rl_dist( dest, u.pos() ) );
10789 }
10790 }
10791 if( stairdist.empty() ) {
10792 return; // Found no stairs?
10793 }
10794
10795 // Find closest stairs.
10796 size_t si = 0;
10797 for( size_t i = 0; i < stairdist.size(); i++ ) {
10798 if( stairdist[i] < stairdist[si] ) {
10799 si = i;
10800 }
10801 }
10802
10803 // Find up to 4 stairs for distance stairdist[si] +1
10804 std::vector<int> nearest;
10805 nearest.push_back( si );
10806 for( size_t i = 0; i < stairdist.size() && nearest.size() < 4; i++ ) {
10807 if( ( i != si ) && ( stairdist[i] <= stairdist[si] + 1 ) ) {
10808 nearest.push_back( i );
10809 }
10810 }
10811 // Randomize the stair choice
10812 si = random_entry_ref( nearest );
10813
10814 // Attempt to spawn zombies.
10815 for( size_t i = 0; i < coming_to_stairs.size(); i++ ) {
10816 point mpos( stairx[si], stairy[si] );
10817 monster &critter = coming_to_stairs[i];
10818 const tripoint dest {
10819 mpos, g->get_levz()
10820 };
10821
10822 // We might be not be visible.
10823 if( ( critter.posx() < 0 - ( MAPSIZE_X ) / 6 ||
10824 critter.posy() < 0 - ( MAPSIZE_Y ) / 6 ||
10825 critter.posx() > ( MAPSIZE_X * 7 ) / 6 ||
10826 critter.posy() > ( MAPSIZE_Y * 7 ) / 6 ) ) {
10827 continue;
10828 }
10829
10830 critter.staircount -= 4;
10831 // Let the player know zombies are trying to come.
10832 if( u.sees( dest ) ) {
10833 std::string dump;
10834 if( critter.staircount > 4 ) {
10835 dump += string_format( _( "You see a %s on the stairs" ), critter.name() );
10836 } else {
10837 if( critter.staircount > 0 ) {
10838 dump += ( from_below ?
10839 //~ The <monster> is almost at the <bottom/top> of the <terrain type>!
10840 string_format( _( "The %1$s is almost at the top of the %2$s!" ),
10841 critter.name(),
10842 m.tername( dest ) ) :
10843 string_format( _( "The %1$s is almost at the bottom of the %2$s!" ),
10844 critter.name(),
10845 m.tername( dest ) ) );
10846 }
10847 }
10848
10849 add_msg( m_warning, dump );
10850 } else {
10852 _( "a sound nearby from the stairs!" ), true, "misc", "stairs_movement" );
10853 }
10854
10855 if( critter.staircount > 0 ) {
10856 continue;
10857 }
10858
10859 if( is_empty( dest ) ) {
10860 critter.spawn( dest );
10861 critter.staircount = 0;
10862 place_critter_at( make_shared_fast<monster>( critter ), dest );
10863 if( u.sees( dest ) ) {
10864 if( !from_below ) {
10865 add_msg( m_warning, _( "The %1$s comes down the %2$s!" ),
10866 critter.name(),
10867 m.tername( dest ) );
10868 } else {
10869 add_msg( m_warning, _( "The %1$s comes up the %2$s!" ),
10870 critter.name(),
10871 m.tername( dest ) );
10872 }
10873 }
10874 coming_to_stairs.erase( coming_to_stairs.begin() + i );
10875 continue;
10876 } else if( u.pos() == dest ) {
10877 // Monster attempts to push player of stairs
10879 int tries = 0;
10880
10881 // the critter is now right on top of you and will attack unless
10882 // it can find a square to push you into with one of his tries.
10883 const int creature_push_attempts = 9;
10884 const int player_throw_resist_chance = 3;
10885
10886 critter.spawn( dest );
10887 while( tries < creature_push_attempts ) {
10888 tries++;
10889 push.x = rng( -1, 1 );
10890 push.y = rng( -1, 1 );
10891 point ipos( mpos + push );
10892 tripoint pos( ipos, get_levz() );
10893 if( ( push.x != 0 || push.y != 0 ) && !critter_at( pos ) &&
10894 critter.can_move_to( pos ) ) {
10895 bool resiststhrow = ( u.is_throw_immune() ) ||
10897 if( resiststhrow && one_in( player_throw_resist_chance ) ) {
10898 u.moves -= 25; // small charge for avoiding the push altogether
10899 add_msg( _( "The %s fails to push you back!" ),
10900 critter.name() );
10901 return; //judo or leg brace prevent you from getting pushed at all
10902 }
10903 // Not accounting for tentacles latching on, so..
10904 // Something is about to happen, lets charge half a move
10905 u.moves -= 50;
10906 if( resiststhrow && ( u.is_throw_immune() ) ) {
10907 //we have a judoka who isn't getting pushed but counterattacking now.
10908 mattack::thrown_by_judo( &critter );
10909 return;
10910 }
10911 std::string msg;
10912 ///\EFFECT_DODGE reduces chance of being downed when pushed off the stairs
10913 if( !( resiststhrow ) && ( u.get_dodge() + rng( 0, 3 ) < 12 ) ) {
10914 // dodge 12 - never get downed
10915 // 11.. avoid 75%; 10.. avoid 50%; 9.. avoid 25%
10916 u.add_effect( effect_downed, 2_turns );
10917 msg = _( "The %s pushed you back hard!" );
10918 } else {
10919 msg = _( "The %s pushed you back!" );
10920 }
10921 add_msg( m_warning, msg.c_str(), critter.name() );
10922 u.setx( u.posx() + push.x );
10923 u.sety( u.posy() + push.y );
10924 return;
10925 }
10926 }
10928 _( "The %s tried to push you back but failed! It attacks you!" ),
10929 critter.name() );
10930 critter.melee_attack( u );
10931 u.moves -= 50;
10932 return;
10933 } else if( monster *const mon_ptr = critter_at<monster>( dest ) ) {
10934 // Monster attempts to displace a monster from the stairs
10935 monster &other = *mon_ptr;
10936 critter.spawn( dest );
10937
10938 // the critter is now right on top of another and will push it
10939 // if it can find a square to push it into inside of his tries.
10940 const int creature_push_attempts = 9;
10941 const int creature_throw_resist = 4;
10942
10943 int tries = 0;
10944 point push2;
10945 while( tries < creature_push_attempts ) {
10946 tries++;
10947 push2.x = rng( -1, 1 );
10948 push2.y = rng( -1, 1 );
10949 point ipos2( mpos + push2 );
10950 tripoint pos( ipos2, get_levz() );
10951 if( ( push2.x == 0 && push2.y == 0 ) || ( ( ipos2.x == u.posx() ) && ( ipos2.y == u.posy() ) ) ) {
10952 continue;
10953 }
10954 if( !critter_at( pos ) && other.can_move_to( pos ) ) {
10955 other.setpos( tripoint( ipos2, get_levz() ) );
10956 other.moves -= 50;
10957 std::string msg;
10958 if( one_in( creature_throw_resist ) ) {
10959 other.add_effect( effect_downed, 2_turns );
10960 msg = _( "The %1$s pushed the %2$s hard." );
10961 } else {
10962 msg = _( "The %1$s pushed the %2$s." );
10963 }
10964 add_msg( m_neutral, msg, critter.name(), other.name() );
10965 return;
10966 }
10967 }
10968 return;
10969 }
10970 }
10971}
void setx(int x)
Definition: character.h:795
void sety(int y)
Definition: character.h:798
bool is_throw_immune() const
Returns true if the player is immune to throws.
float get_dodge() const override
Definition: melee.cpp:809
int monstairz
Definition: game.h:984
tripoint_range< tripoint > points_on_zlevel() const
Yields a range of all points that are contained in the map and have the z-level of this map (abs_sub)...
Definition: map.cpp:8700
bool can_move_to(const tripoint &p) const
Checks whether we can move to/through p.
Definition: monmove.cpp:258
int posy() const override
Definition: monster.h:497
void melee_attack(Creature &target)
Definition: monster.cpp:1398
int staircount
Definition: monster.h:508
void spawn(const tripoint &p)
Definition: monster.cpp:482
int posx() const override
Definition: monster.h:494
bool thrown_by_judo(monster *z)
Definition: monattack.cpp:4674
std::enable_if<!is_std_array< C >::value, constV & >::type random_entry_ref(const C &container)
Same as above, but with a statically allocated default value (using the default constructor).
Definition: rng.h:149

References _, Creature::add_effect(), add_msg(), monster::can_move_to(), coming_to_stairs, critter_at(), debugmsg, effect_downed, g, Character::get_dodge(), get_levz(), map::has_flag(), Character::has_trait(), map::has_zlevels(), is_empty(), Character::is_throw_immune(), m, m_neutral, m_warning, MAPSIZE_X, MAPSIZE_Y, monster::melee_attack(), monstairz, sounds::movement, Creature::moves, monster::name(), one_in(), other, place_critter_at(), point_north_west, map::points_on_zlevel(), Character::pos(), Character::posx(), monster::posx(), Character::posy(), monster::posy(), Character::posz(), monexamine::push(), random_entry_ref(), rl_dist(), rng(), Character::sees(), Character::setx(), Character::sety(), sounds::sound(), monster::spawn(), monster::staircount, string_format(), map::tername(), mattack::thrown_by_judo(), trait_LEG_TENT_BRACE, u, point::x, and point::y.

Referenced by do_turn(), and vertical_move().

◆ update_zombie_pos()

bool game::update_zombie_pos ( const monster critter,
const tripoint pos 
)

Redirects to the creature_tracker update_pos() function.

Definition at line 4683 of file game.cpp.

4684{
4685 return critter_tracker->update_pos( critter, pos );
4686}

References critter_tracker.

◆ use_computer()

void game::use_computer ( const tripoint p)

Checks to see if a player can use a computer (not illiterate, etc.) and uses if able.

Definition at line 4466 of file game.cpp.

4467{
4468 if( u.has_trait( trait_id( "ILLITERATE" ) ) ) {
4469 add_msg( m_info, _( "You can not read a computer screen!" ) );
4470 return;
4471 }
4472 if( u.is_blind() ) {
4473 // we don't have screen readers in game
4474 add_msg( m_info, _( "You can not see a computer screen!" ) );
4475 return;
4476 }
4477 if( u.has_trait( trait_id( "HYPEROPIC" ) ) && !u.worn_with_flag( "FIX_FARSIGHT" ) &&
4478 !u.has_effect( effect_contacts ) && !u.has_bionic( bionic_id( "bio_eye_optic" ) ) ) {
4479 add_msg( m_info, _( "You'll need to put on reading glasses before you can see the screen." ) );
4480 return;
4481 }
4482
4483 computer *used = m.computer_at( p );
4484
4485 if( used == nullptr ) {
4486 if( m.has_flag( "CONSOLE", p ) ) { //Console without map data
4487 add_msg( m_bad, _( "The console doesn't display anything coherent." ) );
4488 } else {
4489 debugmsg( "Tried to use computer at %s - none there", p.to_string() );
4490 }
4491 return;
4492 }
4493
4494 computer_session( *used ).use();
4495}
void use()
Handles player use of a computer.
computer * computer_at(const tripoint &p)
Definition: map.cpp:5615
static const efftype_id effect_contacts("contacts")

References _, add_msg(), map::computer_at(), debugmsg, effect_contacts, Character::has_bionic(), Creature::has_effect(), map::has_flag(), Character::has_trait(), Character::is_blind(), m, m_bad, m_info, tripoint::to_string(), u, computer_session::use(), and Character::worn_with_flag().

Referenced by examine().

◆ validate_camps()

void game::validate_camps ( )

validate camps to ensure they are on the overmap list

Definition at line 1952 of file game.cpp.

1953{
1954 basecamp camp = m.hoist_submap_camp( u.pos() );
1955 if( camp.is_valid() ) {
1956 overmap_buffer.add_camp( camp );
1958 } else if( camp.camp_omt_pos() != tripoint_abs_omt() ) {
1959 std::string camp_name = _( "Faction Camp" );
1960 camp.set_name( camp_name );
1961 overmap_buffer.add_camp( camp );
1963 }
1964}
bool is_valid() const
Definition: basecamp.h:125
void set_name(const std::string &new_name)
Definition: basecamp.cpp:575
tripoint_abs_omt camp_omt_pos() const
Definition: basecamp.h:134
basecamp hoist_submap_camp(const tripoint &p)
Definition: map.cpp:5646
void remove_submap_camp(const tripoint &)
Definition: map.cpp:5641
void add_camp(const basecamp &camp)
Add Basecamp to overmapbuffer.

References _, overmapbuffer::add_camp(), basecamp::camp_omt_pos(), map::hoist_submap_camp(), basecamp::is_valid(), m, overmap_buffer, Character::pos(), map::remove_submap_camp(), basecamp::set_name(), and u.

Referenced by load().

◆ validate_linked_vehicles()

void game::validate_linked_vehicles ( )

validate towed vehicles so they get linked up again after a load

Definition at line 1894 of file game.cpp.

1895{
1896 for( auto &veh : m.get_vehicles() ) {
1897 vehicle *v = veh.v;
1900 if( other_v ) {
1901 // the other vehicle is towing us.
1902 v->tow_data.set_towing( other_v, v );
1904 }
1905 }
1906 }
1907}
tripoint other_towing_point
Definition: vehicle.h:168
bool set_towing(vehicle *tower_veh, vehicle *towed_veh)
Definition: vehicle.cpp:6119
towing_data tow_data
Definition: vehicle.h:1969

References map::get_vehicles(), m, towing_data::other_towing_point, towing_data::set_towing(), vehicle::tow_data, tripoint_zero, map::veh_at(), and veh_pointer_or_null().

Referenced by load().

◆ validate_mounted_npcs()

void game::validate_mounted_npcs ( )

Definition at line 1909 of file game.cpp.

1910{
1911 for( monster &m : all_monsters() ) {
1912 if( m.has_effect( effect_ridden ) && m.mounted_player_id.is_valid() ) {
1913 player *mounted_pl = g->critter_by_id<player>( m.mounted_player_id );
1914 if( !mounted_pl ) {
1915 // Target no longer valid.
1916 m.mounted_player_id = character_id();
1917 m.remove_effect( effect_ridden );
1918 continue;
1919 }
1920 mounted_pl->mounted_creature = shared_from( m );
1921 mounted_pl->setpos( m.pos() );
1922 mounted_pl->add_effect( effect_riding, 1_turns, num_bp );
1923 m.mounted_player = mounted_pl;
1924 }
1925 }
1926}

References Creature::add_effect(), all_monsters(), character_id, effect_ridden, effect_riding, g, m, Character::mounted_creature, num_bp, Character::setpos(), and shared_from().

Referenced by load(), and vertical_shift().

◆ validate_npc_followers()

void game::validate_npc_followers ( )

validate list of followers to account for overmap buffers

Definition at line 1928 of file game.cpp.

1929{
1930 // Make sure visible followers are in the list.
1931 const std::vector<npc *> visible_followers = get_npcs_if( [&]( const npc & guy ) {
1932 return guy.is_player_ally();
1933 } );
1934 for( npc *guy : visible_followers ) {
1935 update_faction_api( guy );
1936 add_npc_follower( guy->getID() );
1937 }
1938 // Make sure overmapbuffered NPC followers are in the list.
1939 for( const auto &temp_guy : overmap_buffer.get_npcs_near_player( 300 ) ) {
1940 npc *guy = temp_guy.get();
1941 if( guy->is_player_ally() ) {
1942 update_faction_api( guy );
1943 add_npc_follower( guy->getID() );
1944 }
1945 }
1946 // Make sure that serialized player followers sync up with game list
1947 for( const auto &temp_id : u.follower_ids ) {
1948 add_npc_follower( temp_id );
1949 }
1950}
void add_npc_follower(const character_id &id)
Add follower id to set of followers.
Definition: game.cpp:1874
static void update_faction_api(npc *guy)
Definition: game.cpp:1886

References add_npc_follower(), player::follower_ids, get_npcs_if(), overmapbuffer::get_npcs_near_player(), Character::getID(), npc::is_player_ally(), overmap_buffer, u, and update_faction_api().

Referenced by load().

◆ vertical_move()

void game::vertical_move ( int  z,
bool  force,
bool  peeking = false 
)

Moves the player vertically.

If force == true then they are falling. If peeking == true, forbids some exotic movement options

Strength increases breath-holding capacity while diving Dexterity increases chance of moving past monsters on stairs Dodge increases chance of moving past monsters on stairs Strength increases chance of moving past monsters on stairs Melee increases chance of moving past monsters on stairs

Definition at line 9938 of file game.cpp.

9939{
9940 if( u.is_mounted() ) {
9941 auto mons = u.mounted_creature.get();
9942 if( mons->has_flag( MF_RIDEABLE_MECH ) ) {
9943 if( !mons->check_mech_powered() ) {
9944 add_msg( m_bad, _( "Your %s refuses to move as its batteries have been drained." ),
9945 mons->get_name() );
9946 return;
9947 }
9948 }
9949 }
9950
9951 // > and < are used for diving underwater.
9952 if( m.has_flag( "SWIMMABLE", u.pos() ) && m.has_flag( TFLAG_DEEP_WATER, u.pos() ) ) {
9953 if( movez == -1 ) {
9954 if( u.is_underwater() ) {
9955 add_msg( m_info, _( "You are already underwater!" ) );
9956 return;
9957 }
9958 if( u.worn_with_flag( "FLOTATION" ) ) {
9959 add_msg( m_info, _( "You can't dive while wearing a flotation device." ) );
9960 return;
9961 }
9962 u.set_underwater( true );
9963 ///\EFFECT_STR increases breath-holding capacity while diving
9964 u.oxygen = 30 + 2 * u.str_cur;
9965 add_msg( _( "You dive underwater!" ) );
9966 } else {
9967 if( u.swim_speed() < 500 || u.shoe_type_count( itype_swim_fins ) ) {
9968 u.set_underwater( false );
9969 add_msg( _( "You surface." ) );
9970 } else {
9971 add_msg( m_info, _( "You try to surface but can't!" ) );
9972 }
9973 }
9974 u.moves -= 100;
9975 return;
9976 }
9977
9978 // Force means we're going down, even if there's no staircase, etc.
9979 bool climbing = false;
9980 int move_cost = 100;
9981 tripoint stairs( u.posx(), u.posy(), u.posz() + movez );
9982 if( m.has_zlevels() && !force && movez == 1 && !m.has_flag( "GOES_UP", u.pos() ) ) {
9983 // Climbing
9984 if( m.has_floor_or_support( stairs ) ) {
9985 add_msg( m_info, _( "You can't climb here - there's a ceiling above your head." ) );
9986 return;
9987 }
9988
9989 std::vector<tripoint> pts;
9990 for( const auto &pt : m.points_in_radius( stairs, 1 ) ) {
9991 if( m.passable( pt ) &&
9992 m.has_floor_or_support( pt ) ) {
9993 pts.push_back( pt );
9994 }
9995 }
9996
9997 const int cost = map_funcs::climbing_cost( m, u.pos(), stairs );
9998
9999 if( cost == 0 ) {
10000 if( u.has_trait( trait_WEB_ROPE ) ) {
10001 if( pts.empty() ) {
10002 add_msg( m_info, _( "There is nothing above you that you can attach a web to." ) );
10003 } else if( can_use_mutation_warn( trait_WEB_ROPE, u ) ) {
10004 if( m.move_cost( u.pos() ) != 2 && m.move_cost( u.pos() ) != 3 ) {
10005 add_msg( m_info, _( "You can't spin a web rope there." ) );
10006 } else if( m.has_furn( u.pos() ) ) {
10007 add_msg( m_info, _( "There is already furniture at that location." ) );
10008 } else {
10009 if( query_yn( "Spin a rope and climb?" ) ) {
10010 add_msg( m_good, _( "You spin a rope of web." ) );
10011 m.furn_set( u.pos(), furn_str_id( "f_rope_up_web" ) );
10012 u.mod_moves( to_turns<int>( 2_seconds ) );
10014 vertical_move( movez, force, peeking );
10015 }
10016 }
10017 }
10018
10019 } else {
10020 add_msg( m_info, _( "You can't climb here - you need walls and/or furniture to brace against." ) );
10021
10022 }
10023 return;
10024
10025 }
10026
10027 if( cost <= 0 || pts.empty() ) {
10028 add_msg( m_info,
10029 _( "You can't climb here - there is no terrain above you that would support your weight." ) );
10030 return;
10031 } else {
10032 // TODO: Make it an extended action
10033 climbing = true;
10034 move_cost = cost;
10035
10037 if( !pnt ) {
10038 return;
10039 }
10040 stairs = *pnt;
10041 }
10042 }
10043
10044 if( !force && movez == -1 && !m.has_flag( "GOES_DOWN", u.pos() ) ) {
10045 add_msg( m_info, _( "You can't go down here!" ) );
10046 return;
10047 } else if( !climbing && !force && movez == 1 && !m.has_flag( "GOES_UP", u.pos() ) ) {
10048 add_msg( m_info, _( "You can't go up here!" ) );
10049 return;
10050 }
10051
10052 if( force ) {
10053 // Let go of a grabbed cart.
10054 u.grab( OBJECT_NONE );
10055 } else if( u.grab_point != tripoint_zero ) {
10056 add_msg( m_info, _( "You can't drag things up and down stairs." ) );
10057 return;
10058 }
10059
10060 // Because get_levz takes z-value from the map, it will change when vertical_shift (m.has_zlevels() == true)
10061 // is called or when the map is loaded on new z-level (== false).
10062 // This caches the z-level we start the movement on (current) and the level we're want to end.
10063 const int z_before = get_levz();
10064 const int z_after = get_levz() + movez;
10065 if( z_after < -OVERMAP_DEPTH || z_after > OVERMAP_HEIGHT ) {
10066 debugmsg( "Tried to move outside allowed range of z-levels" );
10067 return;
10068 }
10069
10070 if( !u.move_effects( false ) ) {
10071 return;
10072 }
10073
10074 // Check if there are monsters are using the stairs.
10075 bool slippedpast = false;
10076 if( !m.has_zlevels() && !coming_to_stairs.empty() && !force ) {
10077 // TODO: Allow travel if zombie couldn't reach stairs, but spawn him when we go up.
10078 add_msg( m_warning, _( "You try to use the stairs. Suddenly you are blocked by a %s!" ),
10079 coming_to_stairs[0].name() );
10080 // Roll.
10081 ///\EFFECT_DEX increases chance of moving past monsters on stairs
10082
10083 ///\EFFECT_DODGE increases chance of moving past monsters on stairs
10084 int dexroll = dice( 6, u.dex_cur + u.get_skill_level( skill_dodge ) * 2 );
10085 ///\EFFECT_STR increases chance of moving past monsters on stairs
10086
10087 ///\EFFECT_MELEE increases chance of moving past monsters on stairs
10088 int strroll = dice( 3, u.str_cur + u.get_skill_level( skill_melee ) * 1.5 );
10089 if( coming_to_stairs.size() > 4 ) {
10090 add_msg( _( "The are a lot of them on the %s!" ), m.tername( u.pos() ) );
10091 dexroll /= 4;
10092 strroll /= 2;
10093 } else if( coming_to_stairs.size() > 1 ) {
10094 add_msg( m_warning, _( "There's something else behind it!" ) );
10095 dexroll /= 2;
10096 }
10097
10098 if( dexroll < 14 || strroll < 12 ) {
10100 u.moves -= 100;
10101 return;
10102 }
10103
10104 add_msg( _( "You manage to slip past!" ) );
10105 slippedpast = true;
10106 u.moves -= 100;
10107 }
10108
10109 // Shift the map up or down
10110
10111 std::unique_ptr<map> tmp_map_ptr;
10112 if( !m.has_zlevels() ) {
10113 tmp_map_ptr = std::make_unique<map>();
10114 }
10115
10116 map &maybetmp = m.has_zlevels() ? m : *( tmp_map_ptr.get() );
10117 if( m.has_zlevels() ) {
10118 // We no longer need to shift the map here! What joy
10119 } else {
10120 maybetmp.load( tripoint( get_levx(), get_levy(), z_after ), false );
10121 }
10122
10123 // Find the corresponding staircase
10124 bool rope_ladder = false;
10125 // TODO: Remove the stairfinding, make the mapgen gen aligned maps
10126 if( !force && !climbing ) {
10127 const cata::optional<tripoint> pnt = find_or_make_stairs( maybetmp, z_after, rope_ladder, peeking );
10128 if( !pnt ) {
10129 return;
10130 }
10131 stairs = *pnt;
10132 }
10133
10134 if( !force ) {
10135 monstairz = z_before;
10136 }
10137 // Save all monsters that can reach the stairs, remove them from the tracker,
10138 // then despawn the remaining monsters. Because it's a vertical shift, all
10139 // monsters are out of the bounds of the map and will despawn.
10140 shared_ptr_fast<monster> stored_mount;
10141 if( u.is_mounted() && !m.has_zlevels() ) {
10142 // Store a *copy* of the mount, so we can remove the original monster instance
10143 // from the tracker before the map shifts.
10144 // Map shifting would otherwise just despawn the mount and would later respawn it.
10145 stored_mount = make_shared_fast<monster>( *u.mounted_creature );
10147 }
10148 if( !m.has_zlevels() ) {
10149 const tripoint to = u.pos();
10150 for( monster &critter : all_monsters() ) {
10151 // if its a ladder instead of stairs - most zombies can't climb that.
10152 // unless that have a special flag to allow them to do so.
10153 if( ( m.has_flag( "DIFFICULT_Z", u.pos() ) && !critter.climbs() ) ||
10154 critter.has_effect( effect_ridden ) ||
10155 critter.has_effect( effect_tied ) ) {
10156 continue;
10157 }
10158 int turns = critter.turns_to_reach( to.xy() );
10159 if( turns < 10 && coming_to_stairs.size() < 8 && critter.will_reach( to.xy() )
10160 && !slippedpast ) {
10161 critter.staircount = 10 + turns;
10162 critter.on_unload();
10163 coming_to_stairs.push_back( critter );
10164 remove_zombie( critter );
10165 }
10166 }
10167 auto mons = critter_tracker->find( g->u.pos() );
10168 if( mons != nullptr ) {
10169 critter_tracker->remove( *mons );
10170 }
10171 shift_monsters( tripoint( 0, 0, movez ) );
10172 }
10173
10174 std::vector<shared_ptr_fast<npc>> npcs_to_bring;
10175 std::vector<monster *> monsters_following;
10176 if( !m.has_zlevels() && std::abs( movez ) == 1 ) {
10177 std::copy_if( active_npc.begin(), active_npc.end(), back_inserter( npcs_to_bring ),
10178 [this]( const shared_ptr_fast<npc> &np ) {
10179 return np->is_walking_with() && !np->is_mounted() && !np->in_sleep_state() &&
10180 rl_dist( np->pos(), u.pos() ) < 2;
10181 } );
10182 }
10183
10184 if( m.has_zlevels() && std::abs( movez ) == 1 ) {
10185 bool ladder = m.has_flag( "DIFFICULT_Z", u.pos() );
10186 for( monster &critter : all_monsters() ) {
10187 if( ladder && !critter.climbs() ) {
10188 continue;
10189 }
10190 if( critter.attack_target() == &g->u || ( !critter.has_effect( effect_ridden ) &&
10191 critter.has_effect( effect_pet ) && critter.friendly == -1 &&
10192 !critter.has_effect( effect_tied ) ) ) {
10193 monsters_following.push_back( &critter );
10194 }
10195 }
10196 }
10197
10198 if( u.is_mounted() ) {
10199 monster *crit = u.mounted_creature.get();
10200 if( crit->has_flag( MF_RIDEABLE_MECH ) ) {
10201 crit->use_mech_power( -1 );
10202 if( u.movement_mode_is( CMM_WALK ) ) {
10203 crit->use_mech_power( -2 );
10204 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
10205 crit->use_mech_power( -1 );
10206 } else if( u.movement_mode_is( CMM_RUN ) ) {
10207 crit->use_mech_power( -3 );
10208 }
10209 }
10210 } else {
10211 u.moves -= move_cost;
10212 }
10213 for( const auto &np : npcs_to_bring ) {
10214 if( np->in_vehicle ) {
10215 m.unboard_vehicle( np->pos() );
10216 }
10217 }
10218 const tripoint old_pos = g->u.pos();
10219 point submap_shift;
10220 vertical_shift( z_after );
10221 if( !force ) {
10222 submap_shift = update_map( stairs.x, stairs.y );
10223 }
10224
10225 // if an NPC or monster is on the stiars when player ascends/descends
10226 // they may end up merged on th esame tile, do some displacement to resolve that.
10227 // if, in the weird case of it not being possible to displace;
10228 // ( how did the player even manage to approach the stairs, if so? )
10229 // then nothing terrible happens, its just weird.
10230 if( critter_at<npc>( u.pos(), true ) || critter_at<monster>( u.pos(), true ) ) {
10231 std::string crit_name;
10232 bool player_displace = false;
10234 if( displace.has_value() ) {
10235 npc *guy = g->critter_at<npc>( u.pos(), true );
10236 if( guy ) {
10237 crit_name = guy->get_name();
10238 tripoint old_pos = guy->pos();
10239 if( !guy->is_enemy() ) {
10240 guy->move_away_from( u.pos(), true );
10241 if( old_pos != guy->pos() ) {
10242 add_msg( _( "%s moves out of the way for you." ), guy->get_name() );
10243 }
10244 } else {
10245 player_displace = true;
10246 }
10247 }
10248 monster *mon = g->critter_at<monster>( u.pos(), true );
10249 // if the monster is ridden by the player or an NPC:
10250 // Dont displace them. If they are mounted by a friendly NPC,
10251 // then the NPC will already have been displaced just above.
10252 // if they are ridden by the player, we want them to coexist on same tile
10253 if( mon && !mon->mounted_player ) {
10254 crit_name = mon->get_name();
10255 if( mon->friendly == -1 ) {
10256 mon->setpos( *displace );
10257 add_msg( _( "Your %s moves out of the way for you." ), mon->get_name() );
10258 } else {
10259 player_displace = true;
10260 }
10261 }
10262 if( player_displace ) {
10263 u.setpos( *displace );
10264 u.moves -= 20;
10265 add_msg( _( "You push past %s blocking the way." ), crit_name );
10266 }
10267 } else {
10268 debugmsg( "Failed to find a spot to displace into." );
10269 }
10270 }
10271
10272 // Now that we know the player's destination position, we can move their mount as well
10273 if( u.is_mounted() ) {
10274 if( stored_mount ) {
10275 assert( !m.has_zlevels() );
10276 stored_mount->spawn( g->u.pos() );
10277 if( critter_tracker->add( stored_mount ) ) {
10278 u.mounted_creature = stored_mount;
10279 }
10280 } else {
10281 u.mounted_creature->setpos( g->u.pos() );
10282 }
10283 }
10284
10285 if( !npcs_to_bring.empty() ) {
10286 // Would look nicer randomly scrambled
10287 std::vector<tripoint> candidates = closest_points_first( u.pos(), 1 );
10288 candidates.erase( std::remove_if( candidates.begin(), candidates.end(),
10289 [this]( const tripoint & c ) {
10290 return !is_empty( c );
10291 } ), candidates.end() );
10292
10293 for( const auto &np : npcs_to_bring ) {
10294 const auto found = std::find_if( candidates.begin(), candidates.end(),
10295 [this, np]( const tripoint & c ) {
10296 return !np->is_dangerous_fields( m.field_at( c ) ) && m.tr_at( c ).is_benign();
10297 } );
10298 if( found != candidates.end() ) {
10299 // TODO: De-uglify
10300 np->setpos( *found );
10301 np->place_on_map();
10302 np->setpos( *found );
10303 candidates.erase( found );
10304 }
10305
10306 if( candidates.empty() ) {
10307 break;
10308 }
10309 }
10310
10311 reload_npcs();
10312 }
10313
10314 // This ugly check is here because of stair teleport bullshit
10315 // TODO: Remove stair teleport bullshit
10316 if( rl_dist( g->u.pos(), old_pos ) <= 1 ) {
10317 for( monster *m : monsters_following ) {
10318 m->set_dest( g->u.pos() );
10319 }
10320 }
10321
10322 if( rope_ladder ) {
10323 m.ter_set( u.pos(), t_rope_up );
10324 }
10325
10326 if( m.ter( stairs ) == t_manhole_cover ) {
10327 m.spawn_item( stairs + point( rng( -1, 1 ), rng( -1, 1 ) ), itype_manhole_cover );
10328 m.ter_set( stairs, t_manhole );
10329 }
10330
10331 // Wouldn't work and may do strange things
10332 if( u.is_hauling() && !m.has_zlevels() ) {
10333 add_msg( _( "You cannot haul items here." ) );
10334 u.stop_hauling();
10335 }
10336
10337 if( u.is_hauling() ) {
10338 const tripoint adjusted_pos = old_pos - sm_to_ms_copy( submap_shift );
10339 start_hauling( adjusted_pos );
10340 }
10341
10342 m.invalidate_map_cache( g->get_levz() );
10343 // Upon force movement, traps can not be avoided.
10344 m.creature_on_trap( u, !force );
10345
10347}
static int move_cost(const item &it, const tripoint &src, const tripoint &dest)
@ CMM_WALK
Definition: character.h:101
@ CMM_CROUCH
Definition: character.h:103
bool move_effects(bool attacking) override
Processes effects which may prevent the Character from moving (bear traps, crushed,...
Definition: character.cpp:1456
int swim_speed() const
Returns the player's speed for swimming across water tiles.
Definition: character.cpp:803
int oxygen
Definition: character.h:1555
void mutation_spend_resources(const trait_id &mut)
Removes the appropriate costs (NOTE: will reapply mods & recalc sightlines in case of newly activated...
Definition: mutation.cpp:1713
int shoe_type_count(const itype_id &it) const
Returns 1 if the player is wearing an item of that count on one foot, 2 if on both,...
Definition: character.cpp:8903
std::string get_name() const override
Definition: character.cpp:5960
void set_underwater(bool x) override
void start_hauling(const tripoint &pos)
Definition: game.cpp:10349
cata::optional< tripoint > find_or_make_stairs(map &mp, int z_after, bool &rope_ladder, bool peeking)
Returns the other end of the stairs (if any).
Definition: game.cpp:10384
bool use_mech_power(int amt)
Definition: monster.cpp:2401
Character * mounted_player
Definition: monster.h:457
static const efftype_id effect_tied("tied")
static const itype_id itype_manhole_cover("manhole_cover")
static const skill_id skill_melee("melee")
static cata::optional< tripoint > point_selection_menu(const std::vector< tripoint > &pts)
Definition: game.cpp:9888
static const itype_id itype_swim_fins("swim_fins")
static const trait_id trait_WEB_ROPE("WEB_ROPE")
ter_id t_rope_up
Definition: mapdata.cpp:721
ter_id t_manhole
Definition: mapdata.cpp:720
bool can_use_mutation_warn(const trait_id &mut, const Character &character)
Calls can_use_mutation and if it fails, print a standard message.
Definition: mutation.cpp:1702
void avatar_moves(const avatar &u, const map &m, const tripoint &p)
Definition: game.cpp:12008
int ladder(player *, item *, bool, const tripoint &)
Definition: iuse.cpp:9355
int climbing_cost(const map &m, const tripoint &from, const tripoint &to)
Checks both the neighborhoods of from and to for climbable surfaces, returns move cost of climbing fr...
point displace(type dir, int dist=1)
Returns point(0, 0) displaced in specified direction by a specified distance.
Definition: overmap.cpp:4178

References _, active_npc, add_msg(), all_monsters(), cata_event_dispatch::avatar_moves(), c, can_use_mutation_warn(), map_funcs::climbing_cost(), closest_points_first(), CMM_CROUCH, CMM_RUN, CMM_WALK, coming_to_stairs, map::creature_on_trap(), critter_tracker, debugmsg, Character::dex_cur, dice(), om_direction::displace(), effect_pet, effect_ridden, effect_tied, find_empty_spot_nearby(), find_or_make_stairs(), monster::friendly, map::furn_set(), g, get_levx(), get_levy(), get_levz(), Character::get_name(), monster::get_name(), Character::get_skill_level(), avatar::grab(), player::grab_point, map::has_flag(), monster::has_flag(), map::has_floor_or_support(), map::has_furn(), Character::has_trait(), map::has_zlevels(), map::invalidate_map_cache(), npc::is_enemy(), Character::is_hauling(), Character::is_mounted(), Creature::is_underwater(), itype_manhole_cover, itype_swim_fins, iuse::ladder(), map::load(), m, m_bad, m_good, m_info, m_warning, MF_RIDEABLE_MECH, Creature::mod_moves(), monstairz, Character::mounted_creature, monster::mounted_player, npc::move_away_from(), move_cost(), map::move_cost(), Character::move_effects(), Character::movement_mode_is(), Creature::moves, Character::mutation_spend_resources(), om_direction::name(), OBJECT_NONE, OVERMAP_HEIGHT, Character::oxygen, map::passable(), point_selection_menu(), map::points_in_radius(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), query_yn(), reload_npcs(), remove_zombie(), rl_dist(), rng(), Character::set_underwater(), Character::setpos(), monster::setpos(), shift_monsters(), Character::shoe_type_count(), skill_dodge, skill_melee, sm_to_ms_copy(), map::spawn_item(), start_hauling(), Character::stop_hauling(), Character::str_cur, Character::swim_speed(), t_manhole, t_manhole_cover, t_rope_up, map::ter(), map::ter_set(), map::tername(), TFLAG_DEEP_WATER, trait_WEB_ROPE, tripoint_zero, u, map::unboard_vehicle(), update_map(), update_stair_monsters(), monster::use_mech_power(), vertical_move(), vertical_shift(), Character::worn_with_flag(), tripoint::x, tripoint::xy(), and tripoint::y.

Referenced by handle_action(), peek(), and vertical_move().

◆ vertical_notes()

void game::vertical_notes ( int  z_before,
int  z_after 
)

Add goes up/down auto_notes (if turned on)

Definition at line 10571 of file game.cpp.

10572{
10573 if( z_before == z_after || !get_option<bool>( "AUTO_NOTES" ) ||
10574 !get_option<bool>( "AUTO_NOTES_STAIRS" ) ) {
10575 return;
10576 }
10577
10578 if( !m.inbounds_z( z_before ) || !m.inbounds_z( z_after ) ) {
10579 debugmsg( "game::vertical_notes invalid arguments: z_before == %d, z_after == %d",
10580 z_before, z_after );
10581 return;
10582 }
10583 // Figure out where we know there are up/down connectors
10584 // Fill in all the tiles we know about (e.g. subway stations)
10585 static const int REVEAL_RADIUS = 40;
10586 for( const tripoint_abs_omt &p : points_in_radius( u.global_omt_location(), REVEAL_RADIUS ) ) {
10587 const tripoint_abs_omt cursp_before( p.xy(), z_before );
10588 const tripoint_abs_omt cursp_after( p.xy(), z_after );
10589
10590 if( !overmap_buffer.seen( cursp_before ) ) {
10591 continue;
10592 }
10593 if( overmap_buffer.has_note( cursp_after ) ) {
10594 // Already has a note -> never add an AUTO-note
10595 continue;
10596 }
10597 const oter_id &ter = overmap_buffer.ter( cursp_before );
10598 const oter_id &ter2 = overmap_buffer.ter( cursp_after );
10599 if( z_after > z_before && ter->has_flag( known_up ) &&
10600 !ter2->has_flag( known_down ) ) {
10601 overmap_buffer.set_seen( cursp_after, true );
10602 overmap_buffer.add_note( cursp_after, string_format( ">:W;%s", _( "AUTO: goes down" ) ) );
10603 } else if( z_after < z_before && ter->has_flag( known_down ) &&
10604 !ter2->has_flag( known_up ) ) {
10605 overmap_buffer.set_seen( cursp_after, true );
10606 overmap_buffer.add_note( cursp_after, string_format( "<:W;%s", _( "AUTO: goes up" ) ) );
10607 }
10608 }
10609}
bool inbounds_z(const int z) const
Definition: map.h:1611
void add_note(const tripoint_abs_omt &, const std::string &message)
@ known_up
Definition: omdata.h:87
@ known_down
Definition: omdata.h:86
bool has_flag(oter_flags flag) const
Definition: omdata.h:258

References _, overmapbuffer::add_note(), debugmsg, Character::global_omt_location(), oter_t::has_flag(), overmapbuffer::has_note(), map::inbounds_z(), known_down, known_up, m, overmap_buffer, points_in_radius(), overmapbuffer::seen(), overmapbuffer::set_seen(), string_format(), overmapbuffer::ter(), and u.

Referenced by vertical_shift().

◆ vertical_shift()

void game::vertical_shift ( int  z_after)

Actual z-level movement part of vertical_move.

Doesn't include stair finding, traps etc.

Definition at line 10534 of file game.cpp.

10535{
10536 if( z_after < -OVERMAP_DEPTH || z_after > OVERMAP_HEIGHT ) {
10537 debugmsg( "Tried to get z-level %d outside allowed range of %d-%d",
10538 z_after, -OVERMAP_DEPTH, OVERMAP_HEIGHT );
10539 return;
10540 }
10541
10542 // TODO: Implement dragging stuff up/down
10543 u.grab( OBJECT_NONE );
10544
10545 scent.reset();
10546
10547 u.setz( z_after );
10548 const int z_before = get_levz();
10549 if( !m.has_zlevels() ) {
10551 m.access_cache( z_before ).vehicle_list.clear();
10552 m.access_cache( z_before ).zone_vehicles.clear();
10553 m.access_cache( z_before ).map_memory_seen_cache.reset();
10554 m.set_transparency_cache_dirty( z_before );
10555 m.set_outside_cache_dirty( z_before );
10556 m.load( tripoint( get_levx(), get_levy(), z_after ), true );
10557 shift_monsters( tripoint( 0, 0, z_after - z_before ) );
10558 reload_npcs();
10559 } else {
10560 // Shift the map itself
10561 m.vertical_shift( z_after );
10562 }
10563
10564 m.spawn_monsters( true );
10565 // this may be required after a vertical shift if z-levels are not enabled
10566 // the critter is unloaded/loaded, and it needs to reconstruct its rider data after being reloaded.
10568 vertical_notes( z_before, z_after );
10569}
void setz(int z)
Definition: character.h:801
void vertical_notes(int z_before, int z_after)
Add goes up/down auto_notes (if turned on)
Definition: game.cpp:10571
void set_transparency_cache_dirty(const int zlev)
Sets a dirty flag on the a given cache.
Definition: map.cpp:199
void set_outside_cache_dirty(const int zlev)
Definition: map.cpp:220
void vertical_shift(int newz)
Moves the map vertically to (not by!) newz.
Definition: map.cpp:6983
std::set< vehicle * > zone_vehicles
Definition: map.h:358
std::set< vehicle * > vehicle_list
Definition: map.h:357

References map::access_cache(), map::clear_vehicle_cache(), debugmsg, get_levx(), get_levy(), get_levz(), avatar::grab(), map::has_zlevels(), map::load(), m, level_cache::map_memory_seen_cache, OBJECT_NONE, OVERMAP_DEPTH, OVERMAP_HEIGHT, reload_npcs(), scent_map::reset(), scent, map::set_outside_cache_dirty(), map::set_transparency_cache_dirty(), Character::setz(), shift_monsters(), map::spawn_monsters(), u, validate_mounted_npcs(), level_cache::vehicle_list, vertical_notes(), map::vertical_shift(), and level_cache::zone_vehicles.

Referenced by place_player(), and vertical_move().

◆ walk_move()

bool game::walk_move ( const tripoint dest,
bool  via_ramp = false 
)

TODO: This should really use the mounted creatures stamina, if mounted. Monsters don't currently have stamina however. For the time being just don't burn players stamina when mounted.

Dexterity decreases chance of tentacles getting stuck to the ground Intelligence decreases chance of tentacles getting stuck to the ground

Definition at line 8728 of file game.cpp.

8729{
8730 if( m.has_flag_ter( TFLAG_SMALL_PASSAGE, dest_loc ) ) {
8731 if( u.get_size() > MS_MEDIUM ) {
8732 add_msg( m_warning, _( "You can't fit there." ) );
8733 return false; // character too large to fit through a tight passage
8734 }
8735 if( u.is_mounted() ) {
8736 monster *mount = u.mounted_creature.get();
8737 if( mount->get_size() > MS_MEDIUM ) {
8738 add_msg( m_warning, _( "Your mount can't fit there." ) );
8739 return false; // char's mount is too large for tight passages
8740 }
8741 }
8742 }
8743
8744 if( u.is_mounted() ) {
8745 auto mons = u.mounted_creature.get();
8746 if( mons->has_flag( MF_RIDEABLE_MECH ) ) {
8747 if( !mons->check_mech_powered() ) {
8748 add_msg( m_bad, _( "Your %s refuses to move as its batteries have been drained." ),
8749 mons->get_name() );
8750 return false;
8751 }
8752 }
8753 if( !mons->move_effects( false ) ) {
8754 add_msg( m_bad, _( "You cannot move as your %s isn't able to move." ), mons->get_name() );
8755 return false;
8756 }
8757 }
8758 const optional_vpart_position vp_here = m.veh_at( u.pos() );
8759 const optional_vpart_position vp_there = m.veh_at( dest_loc );
8760
8761 bool pushing = false; // moving -into- grabbed tile; skip check for move_cost > 0
8762 bool pulling = false; // moving -away- from grabbed tile; check for move_cost > 0
8763 bool shifting_furniture = false; // moving furniture and staying still; skip check for move_cost > 0
8764
8765 const tripoint furn_pos = u.pos() + u.grab_point;
8766 const tripoint furn_dest = dest_loc + u.grab_point;
8767
8768 bool grabbed = u.get_grab_type() != OBJECT_NONE;
8769 if( grabbed ) {
8770 const tripoint dp = dest_loc - u.pos();
8771 pushing = dp == u.grab_point;
8772 pulling = dp == -u.grab_point;
8773 }
8774 if( grabbed && dest_loc.z != u.posz() ) {
8775 add_msg( m_warning, _( "You let go of the grabbed object." ) );
8776 grabbed = false;
8777 u.grab( OBJECT_NONE );
8778 }
8779
8780 // Now make sure we're actually holding something
8781 const vehicle *grabbed_vehicle = nullptr;
8782 if( grabbed && u.get_grab_type() == OBJECT_FURNITURE ) {
8783 // We only care about shifting, because it's the only one that can change our destination
8784 if( m.has_furn( u.pos() + u.grab_point ) ) {
8785 shifting_furniture = !pushing && !pulling;
8786 } else {
8787 // We were grabbing a furniture that isn't there
8788 grabbed = false;
8789 }
8790 } else if( grabbed && u.get_grab_type() == OBJECT_VEHICLE ) {
8791 grabbed_vehicle = veh_pointer_or_null( m.veh_at( u.pos() + u.grab_point ) );
8792 if( grabbed_vehicle == nullptr ) {
8793 // We were grabbing a vehicle that isn't there anymore
8794 grabbed = false;
8795 }
8796 } else if( grabbed ) {
8797 // We were grabbing something WEIRD, let's pretend we weren't
8798 grabbed = false;
8799 }
8800 if( u.grab_point != tripoint_zero && !grabbed ) {
8801 add_msg( m_warning, _( "Can't find grabbed object." ) );
8802 u.grab( OBJECT_NONE );
8803 }
8804
8805 if( m.impassable( dest_loc ) && !pushing && !shifting_furniture ) {
8806 if( vp_there && u.mounted_creature && u.mounted_creature->has_flag( MF_RIDEABLE_MECH ) &&
8807 vp_there->vehicle().handle_potential_theft( u ) ) {
8808 tripoint diff = dest_loc - u.pos();
8809 if( diff.x < 0 ) {
8810 diff.x -= 2;
8811 } else if( diff.x > 0 ) {
8812 diff.x += 2;
8813 }
8814 if( diff.y < 0 ) {
8815 diff.y -= 2;
8816 } else if( diff.y > 0 ) {
8817 diff.y += 2;
8818 }
8819 u.mounted_creature->shove_vehicle( dest_loc + diff.xy(),
8820 dest_loc );
8821 }
8822 return false;
8823 }
8824 if( vp_there && !vp_there->vehicle().handle_potential_theft( u ) ) {
8825 return false;
8826 }
8827 if( u.is_mounted() && !pushing && vp_there ) {
8828 add_msg( m_warning, _( "You cannot board a vehicle whilst riding." ) );
8829 return false;
8830 }
8831 u.set_underwater( false );
8832
8833 if( !shifting_furniture && !pushing && is_dangerous_tile( dest_loc ) ) {
8834 std::vector<std::string> harmful_stuff = get_dangerous_tile( dest_loc );
8835 const auto dangerous_terrain_opt = get_option<std::string>( "DANGEROUS_TERRAIN_WARNING_PROMPT" );
8836 const auto harmful_text = enumerate_as_string( harmful_stuff );
8837 const auto warn_msg = [&]( const char *const msg ) {
8838 add_msg( m_warning, msg, harmful_text );
8839 };
8840
8841 if( dangerous_terrain_opt == "IGNORE" ) {
8842 warn_msg( _( "Stepping into that %1$s looks risky, but you enter anyway." ) );
8843 } else if( dangerous_terrain_opt == "ALWAYS" && !prompt_dangerous_tile( dest_loc ) ) {
8844 return true;
8845 } else if( dangerous_terrain_opt == "RUNNING" &&
8846 ( !u.movement_mode_is( CMM_RUN ) || !prompt_dangerous_tile( dest_loc ) ) ) {
8847 warn_msg( _( "Stepping into that %1$s looks risky. Run into it if you wish to enter anyway." ) );
8848 return true;
8849 } else if( dangerous_terrain_opt == "CROUCHING" &&
8850 ( !u.movement_mode_is( CMM_CROUCH ) || !prompt_dangerous_tile( dest_loc ) ) ) {
8851 warn_msg( _( "Stepping into that %1$s looks risky. Crouch and move into it if you wish to enter anyway." ) );
8852 return true;
8853 } else if( dangerous_terrain_opt == "NEVER" && !u.movement_mode_is( CMM_RUN ) ) {
8854 warn_msg( _( "Stepping into that %1$s looks risky. Run into it if you wish to enter anyway." ) );
8855 return true;
8856 }
8857 }
8858 // Used to decide whether to print a 'moving is slow message
8859 const int mcost_from = m.move_cost( u.pos() ); //calculate this _before_ calling grabbed_move
8860
8861 int modifier = 0;
8862 if( grabbed && u.get_grab_type() == OBJECT_FURNITURE && u.pos() + u.grab_point == dest_loc ) {
8863 modifier = -m.furn( dest_loc ).obj().movecost;
8864 }
8865
8866 int multiplier = 1;
8867 if( u.is_on_ground() ) {
8868 multiplier *= 3;
8869 }
8870
8871 const int mcost = m.combined_movecost( u.pos(), dest_loc, grabbed_vehicle, modifier,
8872 via_ramp ) * multiplier;
8873 if( grabbed_move( dest_loc - u.pos() ) ) {
8874 return true;
8875 } else if( mcost == 0 ) {
8876 return false;
8877 }
8878 bool diag = trigdist && u.posx() != dest_loc.x && u.posy() != dest_loc.y;
8879 const int previous_moves = u.moves;
8880 if( u.is_mounted() ) {
8881 auto crit = u.mounted_creature.get();
8882 if( !crit->has_flag( MF_RIDEABLE_MECH ) &&
8883 ( m.has_flag_ter_or_furn( "MOUNTABLE", dest_loc ) ||
8884 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR", dest_loc ) ||
8885 m.has_flag_ter_or_furn( "OPENCLOSE_INSIDE", dest_loc ) ||
8886 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR_DAMAGED", dest_loc ) ||
8887 m.has_flag_ter_or_furn( "BARRICADABLE_DOOR_REINFORCED", dest_loc ) ) ) {
8888 add_msg( m_warning, _( "You cannot pass obstacles whilst mounted." ) );
8889 return false;
8890 }
8891 const double base_moves = u.run_cost( mcost, diag ) * 100.0 / crit->get_speed();
8892 const double encumb_moves = u.get_weight() / 4800.0_gram;
8893 u.moves -= static_cast<int>( std::ceil( base_moves + encumb_moves ) );
8894 if( u.movement_mode_is( CMM_WALK ) ) {
8895 crit->use_mech_power( -2 );
8896 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
8897 crit->use_mech_power( -1 );
8898 } else if( u.movement_mode_is( CMM_RUN ) ) {
8899 crit->use_mech_power( -3 );
8900 }
8901 } else {
8902 u.moves -= u.run_cost( mcost, diag );
8903 /**
8904 TODO:
8905 This should really use the mounted creatures stamina, if mounted.
8906 Monsters don't currently have stamina however.
8907 For the time being just don't burn players stamina when mounted.
8908 */
8909 if( grabbed_vehicle == nullptr || grabbed_vehicle->wheelcache.empty() ) {
8910 //Burn normal amount of stamina if no vehicle grabbed or vehicle lacks wheels
8911 u.burn_move_stamina( previous_moves - u.moves );
8912 } else {
8913 //Burn half as much stamina if vehicle has wheels, without changing move time
8914 u.burn_move_stamina( 0.50 * ( previous_moves - u.moves ) );
8915 }
8916 }
8917 // Max out recoil & reset aim point
8920
8921 // Print a message if movement is slow
8922 const int mcost_to = m.move_cost( dest_loc ); //calculate this _after_ calling grabbed_move
8923 const bool fungus = m.has_flag_ter_or_furn( "FUNGUS", u.pos() ) ||
8924 m.has_flag_ter_or_furn( "FUNGUS",
8925 dest_loc ); //fungal furniture has no slowing effect on mycus characters
8926 const bool slowed = ( ( !u.has_trait( trait_PARKOUR ) && ( mcost_to > 2 || mcost_from > 2 ) ) ||
8927 mcost_to > 4 || mcost_from > 4 ) &&
8928 !( u.has_trait( trait_M_IMMUNE ) && fungus );
8929 if( slowed && !u.is_mounted() ) {
8930 // Unless u.pos() has a higher movecost than dest_loc, state that dest_loc is the cause
8931 if( mcost_to >= mcost_from ) {
8932 if( auto displayed_part = vp_there.part_displayed() ) {
8933 add_msg( m_warning, _( "Moving onto this %s is slow!" ),
8934 displayed_part->part().name() );
8935 sfx::do_obstacle( displayed_part->part().info().get_id().str() );
8936 } else {
8937 add_msg( m_warning, _( "Moving onto this %s is slow!" ), m.name( dest_loc ) );
8938 sfx::do_obstacle( m.ter( dest_loc ).id().str() );
8939 }
8940 } else {
8941 if( auto displayed_part = vp_here.part_displayed() ) {
8942 add_msg( m_warning, _( "Moving off of this %s is slow!" ),
8943 displayed_part->part().name() );
8944 sfx::do_obstacle( displayed_part->part().info().get_id().str() );
8945 } else {
8946 add_msg( m_warning, _( "Moving off of this %s is slow!" ), m.name( u.pos() ) );
8947 sfx::do_obstacle( m.ter( u.pos() ).id().str() );
8948 }
8949 }
8950 }
8951 if( !u.is_mounted() && u.has_trait( trait_id( "LEG_TENT_BRACE" ) ) &&
8952 ( !u.footwear_factor() ||
8953 ( u.footwear_factor() == .5 && one_in( 2 ) ) ) ) {
8954 // DX and IN are long suits for Cephalopods,
8955 // so this shouldn't cause too much hardship
8956 // Presumed that if it's swimmable, they're
8957 // swimming and won't stick
8958 ///\EFFECT_DEX decreases chance of tentacles getting stuck to the ground
8959
8960 ///\EFFECT_INT decreases chance of tentacles getting stuck to the ground
8961 if( !m.has_flag( "SWIMMABLE", dest_loc ) && one_in( 80 + u.dex_cur + u.int_cur ) ) {
8962 add_msg( _( "Your tentacles stick to the ground, but you pull them free." ) );
8963 u.mod_fatigue( 1 );
8964 }
8965 }
8966 if( !u.has_artifact_with( AEP_STEALTH ) && !u.has_trait( trait_id( "DEBUG_SILENT" ) ) ) {
8967 int volume = u.is_stealthy() ? 3 : 6;
8968 volume *= u.mutation_value( "noise_modifier" );
8969 if( volume > 0 ) {
8971 volume = 2;
8972 } else if( u.has_bionic( bionic_id( "bio_ankles" ) ) ) {
8973 volume = 12;
8974 }
8975 if( u.movement_mode_is( CMM_RUN ) ) {
8976 volume *= 1.5;
8977 } else if( u.movement_mode_is( CMM_CROUCH ) ) {
8978 volume /= 2;
8979 }
8980 if( u.is_mounted() ) {
8981 auto mons = u.mounted_creature.get();
8982 switch( mons->get_size() ) {
8983 case MS_TINY:
8984 volume = 0; // No sound for the tinies
8985 break;
8986 case MS_SMALL:
8987 volume /= 3;
8988 break;
8989 case MS_MEDIUM:
8990 break;
8991 case MS_LARGE:
8992 volume *= 1.5;
8993 break;
8994 case MS_HUGE:
8995 volume *= 2;
8996 break;
8997 default:
8998 break;
8999 }
9000 if( mons->has_flag( MF_LOUDMOVES ) ) {
9001 volume += 6;
9002 }
9003 sounds::sound( dest_loc, volume, sounds::sound_t::movement, mons->type->get_footsteps(), false,
9004 "none", "none" );
9005 } else {
9006 sounds::sound( dest_loc, volume, sounds::sound_t::movement, _( "footsteps" ), true,
9007 "none", "none" ); // Sound of footsteps may awaken nearby monsters
9008 }
9010 }
9011
9012 if( one_in( 20 ) && u.has_artifact_with( AEP_MOVEMENT_NOISE ) ) {
9013 sounds::sound( u.pos(), 40, sounds::sound_t::movement, _( "a rattling sound." ), true,
9014 "misc", "rattling" );
9015 }
9016 }
9017
9018 if( m.has_flag_ter_or_furn( TFLAG_HIDE_PLACE, dest_loc ) ) {
9019 add_msg( m_good, _( "You are hiding in the %s." ), m.name( dest_loc ) );
9020 }
9021
9022 if( dest_loc != u.pos() ) {
9024 }
9025
9026 tripoint oldpos = u.pos();
9027 point submap_shift = place_player( dest_loc );
9028 point ms_shift = sm_to_ms_copy( submap_shift );
9029 oldpos = oldpos - ms_shift;
9030
9031 if( pulling ) {
9032 const tripoint shifted_furn_pos = furn_pos - ms_shift;
9033 const tripoint shifted_furn_dest = furn_dest - ms_shift;
9034 const time_duration fire_age = m.get_field_age( shifted_furn_pos, fd_fire );
9035 const int fire_intensity = m.get_field_intensity( shifted_furn_pos, fd_fire );
9036 m.remove_field( shifted_furn_pos, fd_fire );
9037 m.set_field_intensity( shifted_furn_dest, fd_fire, fire_intensity );
9038 m.set_field_age( shifted_furn_dest, fd_fire, fire_age );
9039 }
9040
9041 if( u.is_hauling() ) {
9042 start_hauling( oldpos );
9043 }
9044
9046
9047 return true;
9048}
void burn_move_stamina(int moves)
Definition: character.cpp:7079
bool is_stealthy() const
Returns true if the player has stealthy movement.
virtual bool has_artifact_with(art_effect_passive effect) const
Definition: character.cpp:3181
units::mass get_weight() const override
Returns body weight plus weight of inventory and worn/wielded items.
Definition: character.cpp:3652
bool is_on_ground() const override
Returns true if the player is knocked over or has broken legs.
Definition: character.cpp:883
float mutation_value(const std::string &val) const
Goes over all mutations, gets min and max of a value with given name.
Definition: character.cpp:6605
int run_cost(int base_cost, bool diag=false) const
Returns the player's modified base movement cost.
Definition: character.cpp:9976
m_size get_size() const override
Get size class of character.
Definition: character.cpp:561
bool grabbed_move(const tripoint &dp)
Check for dangerous stuff at dest_loc, return false if the player decides not to step there.
Definition: game.cpp:9654
bool is_dangerous_tile(const tripoint &dest_loc) const
Definition: game.cpp:8657
int combined_movecost(const tripoint &from, const tripoint &to, const vehicle *ignored_vehicle=nullptr, int modifier=0, bool flying=false, bool via_ramp=false) const
Cost to move out of one tile and into the next.
Definition: map.cpp:1896
m_size get_size() const override
Definition: monster.cpp:2701
cata::optional< vpart_reference > part_displayed() const
Definition: vehicle.cpp:2499
cata::optional< tripoint > last_target_pos
Definition: player.h:242
const std::string & str() const
Returns the identifier as plain std::string.
Definition: string_id.h:255
@ MS_TINY
Definition: creature.h:58
@ MS_LARGE
Definition: creature.h:61
@ MS_MEDIUM
Definition: creature.h:60
static const itype_id itype_rm13_armor_on("rm13_armor_on")
static const trait_id trait_M_IMMUNE("M_IMMUNE")
@ TFLAG_SMALL_PASSAGE
Definition: mapdata.h:320
@ TFLAG_HIDE_PLACE
Definition: mapdata.h:315
@ MF_LOUDMOVES
Definition: mtype.h:175
void fungus(player &p, const tripoint &examp)
Remove furniture.
Definition: iexamine.cpp:2222
void do_obstacle(const std::string &obst="")
Definition: sounds.cpp:1633
void do_footstep()
Definition: sounds.cpp:1610

References _, add_msg(), AEP_MOVEMENT_NOISE, AEP_STEALTH, cata_event_dispatch::avatar_moves(), Character::burn_move_stamina(), CMM_CROUCH, CMM_RUN, CMM_WALK, map::combined_movecost(), Character::dex_cur, sfx::do_footstep(), sfx::do_obstacle(), enumerate_as_string(), fd_fire, Character::footwear_factor(), iexamine::fungus(), map::furn(), get_dangerous_tile(), map::get_field_age(), map::get_field_intensity(), avatar::get_grab_type(), Character::get_size(), monster::get_size(), Character::get_weight(), avatar::grab(), player::grab_point, grabbed_move(), Character::has_artifact_with(), Character::has_bionic(), map::has_flag(), map::has_flag_ter(), map::has_flag_ter_or_furn(), map::has_furn(), Character::has_trait(), int_id< T >::id(), map::impassable(), Character::int_cur, is_dangerous_tile(), Character::is_hauling(), Character::is_mounted(), Character::is_on_ground(), Character::is_stealthy(), Character::is_wearing(), itype_rm13_armor_on, player::last_target_pos, m, m_bad, m_good, m_warning, MAX_RECOIL, MF_LOUDMOVES, MF_RIDEABLE_MECH, Character::mod_fatigue(), Character::mounted_creature, map::move_cost(), map_data_common_t::movecost, sounds::movement, Character::movement_mode_is(), Creature::moves, MS_HUGE, MS_LARGE, MS_MEDIUM, MS_SMALL, MS_TINY, Character::mutation_value(), map::name(), cata::nullopt, int_id< T >::obj(), OBJECT_FURNITURE, OBJECT_NONE, OBJECT_VEHICLE, on_move_effects(), one_in(), optional_vpart_position::part_displayed(), place_player(), Character::pos(), Character::posx(), Character::posy(), Character::posz(), prompt_dangerous_tile(), Character::recoil, map::remove_field(), Character::run_cost(), map::set_field_age(), map::set_field_intensity(), Character::set_underwater(), sm_to_ms_copy(), sounds::sound(), start_hauling(), string_id< T >::str(), map::ter(), TFLAG_HIDE_PLACE, TFLAG_SMALL_PASSAGE, trait_M_IMMUNE, trait_PARKOUR, trigdist, tripoint_zero, u, map::veh_at(), veh_pointer_or_null(), vehicle::wheelcache, tripoint::x, tripoint::xy(), tripoint::y, and tripoint::z.

Referenced by swap_critters().

◆ win()

void game::win ( )

Marks the game as won.

Doesn't end the game.

Definition at line 2423 of file game.cpp.

2424{
2425 win_screen();
2427 memorial().add(
2428 pgettext( "memorial_male", "Closed the portal in %1$.1f days (%2$d seconds)." ),
2429 pgettext( "memorial_female", "Closed the portal in %1$.1f days (%2$d seconds)." ),
2430 to_days<float>( game_duration ), to_seconds<int>( game_duration ) );
2431 if( !u.is_dead_state() ) {
2434 }
2435}
void win_screen()
Definition: game.cpp:2437
void add(const std::string &male_msg, const std::string &female_msg)
Adds an event to the memorial log, to be written to the memorial file when the character dies.
const time_point & start_of_game
Definition: calendar.cpp:34

References achievements_tracker_ptr, memorial_logger::add(), Messages::display_messages(), get_kill_tracker(), Character::is_dead_state(), memorial(), pgettext(), show_scores_ui(), calendar::start_of_game, stats(), calendar::turn, u, and win_screen().

◆ win_screen()

void game::win_screen ( )
private

Definition at line 2437 of file game.cpp.

2438{
2439 // TODO: Move this wall somewhere
2441 std::string msg = _( "You managed to close the portal and end the invasion!" );
2442 msg += '\n';
2443 if( u.is_dead_state() ) {
2445 "Unfortunately, you had to sacrifice your life to achieve this." );
2446 msg += colorize( t, c_red ) + '\n';
2447 memorial().add(
2448 pgettext( "memorial_male", "Sacrificed his life to close the portal." ),
2449 pgettext( "memorial_female", "Sacrificed her life to close the portal." ) );
2450 } else {
2451 translation t = translation::to_translation( "win_game", "You managed to survive the ordeal." );
2452 msg += colorize( t, c_green ) + '\n';
2453 memorial().add(
2454 pgettext( "memorial_male", "Safely closed the portal." ),
2455 pgettext( "memorial_female", "Safely closed the portal." ) );
2456 }
2457 msg += string_format( _( "It took you %1$.1f days (%2$d seconds)." ),
2458 to_days<float>( game_duration ), to_seconds<int>( game_duration ) );
2459 // TODO: Print starting stats, traits, skills, all mods ever used, easiest of settings
2460 popup( msg );
2461}
Class for storing translation context and raw string for deferred translation.
Definition: translations.h:152
static translation to_translation(const std::string &raw)
Store a string, an optional plural form, and an optional context for translation.

References _, memorial_logger::add(), c_green, c_red, colorize(), Character::is_dead_state(), memorial(), pgettext(), popup(), calendar::start_of_game, string_format(), translation::to_translation(), calendar::turn, and u.

Referenced by win().

◆ write_memorial_file()

void game::write_memorial_file ( const std::string &  filename,
std::string  sLastWords 
)

Writes information about the character out to a text file timestamped with the time of the file was made.

This serves as a record of the character's state at the time the memorial was made (usually upon death) and accomplishments in a human-readable format.

Definition at line 2762 of file game.cpp.

2763{
2764 const std::string &memorial_dir = PATH_INFO::memorialdir();
2765 const std::string &memorial_active_world_dir = memorial_dir +
2766 world_generator->active_world->world_name + "/";
2767
2768 //Check if both dirs exist. Nested assure_dir_exist fails if the first dir of the nested dir does not exist.
2769 if( !assure_dir_exist( memorial_dir ) ) {
2770 debugmsg( "Could not make '%s' directory", memorial_dir );
2771 return;
2772 }
2773
2774 if( !assure_dir_exist( memorial_active_world_dir ) ) {
2775 debugmsg( "Could not make '%s' directory", memorial_active_world_dir );
2776 return;
2777 }
2778
2779 std::string path = memorial_active_world_dir + filename + ".txt";
2780
2781 write_to_file( path, [&]( std::ostream & fout ) {
2782 memorial().write( fout, sLastWords );
2783 }, _( "player memorial" ) );
2784}
void write(std::ostream &memorial_file, const std::string &epitaph) const
std::string memorialdir()
Definition: path_info.cpp:230

References _, assure_dir_exist(), debugmsg, memorial(), PATH_INFO::memorialdir(), world_generator, memorial_logger::write(), and write_to_file().

Referenced by cleanup_at_end().

◆ zones_manager()

void game::zones_manager ( )

Definition at line 6063 of file game.cpp.

6064{
6065 const tripoint stored_view_offset = u.view_offset;
6066
6068
6069 const int zone_ui_height = 12;
6070 const int zone_options_height = 7;
6071
6072 const int width = 45;
6073
6074 int offsetX = 0;
6075 int max_rows = 0;
6076
6077 catacurses::window w_zones;
6078 catacurses::window w_zones_border;
6079 catacurses::window w_zones_info;
6080 catacurses::window w_zones_info_border;
6081 catacurses::window w_zones_options;
6082
6083 bool show = true;
6084
6085 ui_adaptor ui;
6086 ui.on_screen_resize( [&]( ui_adaptor & ui ) {
6087 if( !show ) {
6088 ui.position( point_zero, point_zero );
6089 return;
6090 }
6091 offsetX = get_option<std::string>( "SIDEBAR_POSITION" ) != "left" ?
6092 TERMX - width : 0;
6093 const int w_zone_height = TERMY - zone_ui_height;
6094 max_rows = w_zone_height - 2;
6095 w_zones = catacurses::newwin( w_zone_height - 2, width - 2,
6096 point( offsetX + 1, 1 ) );
6097 w_zones_border = catacurses::newwin( w_zone_height, width,
6098 point( offsetX, 0 ) );
6099 w_zones_info = catacurses::newwin( zone_ui_height - zone_options_height - 1,
6100 width - 2, point( offsetX + 1, w_zone_height ) );
6101 w_zones_info_border = catacurses::newwin( zone_ui_height, width,
6102 point( offsetX, w_zone_height ) );
6103 w_zones_options = catacurses::newwin( zone_options_height - 1, width - 2,
6104 point( offsetX + 1, TERMY - zone_options_height ) );
6105
6106 ui.position( point( offsetX, 0 ), point( width, TERMY ) );
6107 } );
6108 ui.mark_resize();
6109
6110 std::string action;
6111 input_context ctxt( "ZONES_MANAGER" );
6112 ctxt.register_cardinal();
6113 ctxt.register_action( "CONFIRM" );
6114 ctxt.register_action( "QUIT" );
6115 ctxt.register_action( "ADD_ZONE" );
6116 ctxt.register_action( "REMOVE_ZONE" );
6117 ctxt.register_action( "MOVE_ZONE_UP" );
6118 ctxt.register_action( "MOVE_ZONE_DOWN" );
6119 ctxt.register_action( "SHOW_ZONE_ON_MAP" );
6120 ctxt.register_action( "ENABLE_ZONE" );
6121 ctxt.register_action( "DISABLE_ZONE" );
6122 ctxt.register_action( "SHOW_ALL_ZONES" );
6123 ctxt.register_action( "HELP_KEYBINDINGS" );
6124
6125 auto &mgr = zone_manager::get_manager();
6126 int start_index = 0;
6127 int active_index = 0;
6128 bool blink = false;
6129 bool stuff_changed = false;
6130 bool show_all_zones = false;
6131 int zone_cnt = 0;
6132
6133 // get zones on the same z-level, with distance between player and
6134 // zone center point <= 50 or all zones, if show_all_zones is true
6135 auto get_zones = [&]() {
6136 std::vector<zone_manager::ref_zone_data> zones;
6137 if( show_all_zones ) {
6138 zones = mgr.get_zones();
6139 } else {
6140 const tripoint &u_abs_pos = m.getabs( u.pos() );
6141 for( zone_manager::ref_zone_data &ref : mgr.get_zones() ) {
6142 const tripoint &zone_abs_pos = ref.get().get_center_point();
6143 if( u_abs_pos.z == zone_abs_pos.z && rl_dist( u_abs_pos, zone_abs_pos ) <= 50 ) {
6144 zones.emplace_back( ref );
6145 }
6146 }
6147 }
6148 zone_cnt = static_cast<int>( zones.size() );
6149 return zones;
6150 };
6151
6152 auto zones = get_zones();
6153
6154 auto zones_manager_options = [&]() {
6155 werase( w_zones_options );
6156
6157 if( zone_cnt > 0 ) {
6158 const auto &zone = zones[active_index].get();
6159
6160 if( zone.has_options() ) {
6161 const auto &descriptions = zone.get_options().get_descriptions();
6162
6163 // NOLINTNEXTLINE(cata-use-named-point-constants)
6164 mvwprintz( w_zones_options, point( 1, 0 ), c_white, _( "Options" ) );
6165
6166 int y = 1;
6167 for( const auto &desc : descriptions ) {
6168 mvwprintz( w_zones_options, point( 3, y ), c_white, desc.first );
6169 mvwprintz( w_zones_options, point( 20, y ), c_white, desc.second );
6170 y++;
6171 }
6172 }
6173 }
6174
6175 wnoutrefresh( w_zones_options );
6176 };
6177
6178 cata::optional<tripoint> zone_start;
6179 cata::optional<tripoint> zone_end;
6180 bool zone_blink = false;
6181 bool zone_cursor = false;
6183 zone_start, zone_end, zone_blink, zone_cursor );
6184 add_draw_callback( zone_cb );
6185
6186 auto query_position =
6187 [&]() -> cata::optional<std::pair<tripoint, tripoint>> {
6188 on_out_of_scope invalidate_current_ui( [&]()
6189 {
6190 ui.mark_resize();
6191 } );
6192 restore_on_out_of_scope<bool> show_prev( show );
6193 restore_on_out_of_scope<cata::optional<tripoint>> zone_start_prev( zone_start );
6194 restore_on_out_of_scope<cata::optional<tripoint>> zone_end_prev( zone_end );
6195 show = false;
6196 zone_start = cata::nullopt;
6197 zone_end = cata::nullopt;
6198 ui.mark_resize();
6199
6201 popup.on_top( true );
6202 popup.message( "%s", _( "Select first point." ) );
6203
6205
6206 const look_around_result first = look_around( /*show_window=*/false, center, center, false, true,
6207 false );
6208 if( first.position )
6209 {
6210 popup.message( "%s", _( "Select second point." ) );
6211
6212 const look_around_result second = look_around( /*show_window=*/false, center, *first.position,
6213 true, true, false );
6214 if( second.position ) {
6215 tripoint first_abs = m.getabs( tripoint( std::min( first.position->x,
6216 second.position->x ),
6217 std::min( first.position->y, second.position->y ),
6218 std::min( first.position->z,
6219 second.position->z ) ) );
6220 tripoint second_abs = m.getabs( tripoint( std::max( first.position->x,
6221 second.position->x ),
6222 std::max( first.position->y, second.position->y ),
6223 std::max( first.position->z,
6224 second.position->z ) ) );
6225 return std::pair<tripoint, tripoint>( first_abs, second_abs );
6226 }
6227 }
6228
6229 return cata::nullopt;
6230 };
6231
6232 ui.on_redraw( [&]( const ui_adaptor & ) {
6233 if( !show ) {
6234 return;
6235 }
6236 zones_manager_draw_borders( w_zones_border, w_zones_info_border, zone_ui_height, width );
6237 zones_manager_shortcuts( w_zones_info );
6238
6239 if( zone_cnt == 0 ) {
6240 werase( w_zones );
6241 mvwprintz( w_zones, point( 2, 5 ), c_white, _( "No Zones defined." ) );
6242
6243 } else {
6244 werase( w_zones );
6245
6246 calcStartPos( start_index, active_index, max_rows, zone_cnt );
6247
6248 draw_scrollbar( w_zones_border, active_index, max_rows, zone_cnt, point_south );
6249 wnoutrefresh( w_zones_border );
6250
6251 int iNum = 0;
6252
6253 tripoint player_absolute_pos = m.getabs( u.pos() );
6254
6255 //Display saved zones
6256 for( auto &i : zones ) {
6257 if( iNum >= start_index &&
6258 iNum < start_index + ( ( max_rows > zone_cnt ) ? zone_cnt : max_rows ) ) {
6259 const auto &zone = i.get();
6260
6261 nc_color colorLine = ( zone.get_enabled() ) ? c_white : c_light_gray;
6262
6263 if( iNum == active_index ) {
6264 mvwprintz( w_zones, point( 0, iNum - start_index ), c_yellow, "%s", ">>" );
6265 colorLine = ( zone.get_enabled() ) ? c_light_green : c_green;
6266 }
6267
6268 //Draw Zone name
6269 mvwprintz( w_zones, point( 3, iNum - start_index ), colorLine,
6270 trim_by_length( zone.get_name(), 15 ) );
6271
6272 //Draw Type name
6273 mvwprintz( w_zones, point( 20, iNum - start_index ), colorLine,
6274 mgr.get_name_from_type( zone.get_type() ) );
6275
6276 tripoint center = zone.get_center_point();
6277
6278 //Draw direction + distance
6279 mvwprintz( w_zones, point( 32, iNum - start_index ), colorLine, "%*d %s",
6280 5, static_cast<int>( trig_dist( player_absolute_pos, center ) ),
6281 direction_name_short( direction_from( player_absolute_pos,
6282 center ) ) );
6283
6284 //Draw Vehicle Indicator
6285 mvwprintz( w_zones, point( 41, iNum - start_index ), colorLine,
6286 zone.get_is_vehicle() ? "*" : "" );
6287 }
6288 iNum++;
6289 }
6290
6291 // Display zone options
6292 zones_manager_options();
6293 }
6294
6295 wnoutrefresh( w_zones );
6296 } );
6297
6298 zones_manager_open = true;
6299 do {
6300 if( action == "ADD_ZONE" ) {
6301 do { // not a loop, just for quick bailing out if canceled
6302 const auto maybe_id = mgr.query_type();
6303 if( !maybe_id.has_value() ) {
6304 break;
6305 }
6306
6307 const zone_type_id &id = maybe_id.value();
6308 auto options = zone_options::create( id );
6309
6310 if( !options->query_at_creation() ) {
6311 break;
6312 }
6313
6314 auto default_name = options->get_zone_name_suggestion();
6315 if( default_name.empty() ) {
6316 default_name = mgr.get_name_from_type( id );
6317 }
6318 const auto maybe_name = mgr.query_name( default_name );
6319 if( !maybe_name.has_value() ) {
6320 break;
6321 }
6322 const std::string &name = maybe_name.value();
6323
6324 const auto position = query_position();
6325 if( !position ) {
6326 break;
6327 }
6328
6329 mgr.add( name, id, g->u.get_faction()->id, false, true, position->first,
6330 position->second, options );
6331
6332 zones = get_zones();
6333 active_index = zone_cnt - 1;
6334
6335 stuff_changed = true;
6336 } while( false );
6337
6338 blink = false;
6339 } else if( action == "SHOW_ALL_ZONES" ) {
6340 show_all_zones = !show_all_zones;
6341 zones = get_zones();
6342 active_index = 0;
6343 } else if( zone_cnt > 0 ) {
6344 if( action == "UP" ) {
6345 active_index--;
6346 if( active_index < 0 ) {
6347 active_index = zone_cnt - 1;
6348 }
6349 blink = false;
6350 } else if( action == "DOWN" ) {
6351 active_index++;
6352 if( active_index >= zone_cnt ) {
6353 active_index = 0;
6354 }
6355 blink = false;
6356 } else if( action == "REMOVE_ZONE" ) {
6357 if( active_index < zone_cnt ) {
6358 mgr.remove( zones[active_index] );
6359 zones = get_zones();
6360 active_index--;
6361
6362 if( active_index < 0 ) {
6363 active_index = 0;
6364 }
6365 }
6366 blink = false;
6367 stuff_changed = true;
6368
6369 } else if( action == "CONFIRM" ) {
6370 auto &zone = zones[active_index].get();
6371
6372 uilist as_m;
6373 as_m.text = _( "What do you want to change:" );
6374 as_m.entries.emplace_back( 1, true, '1', _( "Edit name" ) );
6375 as_m.entries.emplace_back( 2, true, '2', _( "Edit type" ) );
6376 as_m.entries.emplace_back( 3, zone.get_options().has_options(), '3',
6377 zone.get_type() == zone_type_id( "LOOT_CUSTOM" ) ? _( "Edit filter" ) : _( "Edit options" ) );
6378 as_m.entries.emplace_back( 4, !zone.get_is_vehicle(), '4', _( "Edit position" ) );
6379 // TODO: Enable moving vzone after vehicle zone can be bigger than 1*1
6380 as_m.entries.emplace_back( 5, !zone.get_is_vehicle(), '5', _( "Move position" ) );
6381 as_m.query();
6382
6383 switch( as_m.ret ) {
6384 case 1:
6385 if( zone.set_name() ) {
6386 stuff_changed = true;
6387 }
6388 break;
6389 case 2:
6390 if( zone.set_type() ) {
6391 stuff_changed = true;
6392 }
6393 break;
6394 case 3:
6395 if( zone.get_options().query() ) {
6396 stuff_changed = true;
6397 }
6398 break;
6399 case 4: {
6400 const auto pos = query_position();
6401 if( pos && ( pos->first != zone.get_start_point() ||
6402 pos->second != zone.get_end_point() ) ) {
6403 zone.set_position( *pos );
6404 stuff_changed = true;
6405 }
6406 break;
6407 }
6408 case 5: {
6409 on_out_of_scope invalidate_current_ui( [&]() {
6410 ui.mark_resize();
6411 } );
6412 restore_on_out_of_scope<bool> show_prev( show );
6413 restore_on_out_of_scope<cata::optional<tripoint>> zone_start_prev( zone_start );
6414 restore_on_out_of_scope<cata::optional<tripoint>> zone_end_prev( zone_end );
6415 show = false;
6416 zone_start = cata::nullopt;
6417 zone_end = cata::nullopt;
6418 ui.mark_resize();
6419 static_popup message_pop;
6420 message_pop.on_top( true );
6421 message_pop.message( "%s", _( "Moving zone." ) );
6422 const auto zone_local_start_point = m.getlocal( zone.get_start_point() );
6423 const auto zone_local_end_point = m.getlocal( zone.get_end_point() );
6424 // local position of the zone center, used to calculate the u.view_offset,
6425 // could center the screen to the position it represents
6426 auto view_center = m.getlocal( zone.get_center_point() );
6427 const look_around_result result_local = look_around( false, view_center,
6428 zone_local_start_point, false, false,
6429 false, true, zone_local_end_point );
6430 if( result_local.position ) {
6431 const auto new_start_point = m.getabs( *result_local.position );
6432 if( new_start_point == zone.get_start_point() ) {
6433 break; // Nothing changed, don't save
6434 }
6435
6436 const auto new_end_point = zone.get_end_point() - zone.get_start_point() + new_start_point;
6437 zone.set_position( std::pair<tripoint, tripoint>( new_start_point, new_end_point ) );
6438 stuff_changed = true;
6439 }
6440 }
6441 break;
6442 default:
6443 break;
6444 }
6445
6446 blink = false;
6447 } else if( action == "MOVE_ZONE_UP" && zone_cnt > 1 ) {
6448 if( active_index < zone_cnt - 1 ) {
6449 mgr.swap( zones[active_index], zones[active_index + 1] );
6450 zones = get_zones();
6451 active_index++;
6452 }
6453 blink = false;
6454 stuff_changed = true;
6455
6456 } else if( action == "MOVE_ZONE_DOWN" && zone_cnt > 1 ) {
6457 if( active_index > 0 ) {
6458 mgr.swap( zones[active_index], zones[active_index - 1] );
6459 zones = get_zones();
6460 active_index--;
6461 }
6462 blink = false;
6463 stuff_changed = true;
6464
6465 } else if( action == "SHOW_ZONE_ON_MAP" ) {
6466 //show zone position on overmap;
6467 tripoint_abs_omt player_overmap_position = u.global_omt_location();
6468 // TODO: fix point types
6469 tripoint_abs_omt zone_overmap( ms_to_omt_copy( zones[active_index].get().get_center_point() ) );
6470
6471 ui::omap::display_zones( player_overmap_position, zone_overmap, active_index );
6472 } else if( action == "ENABLE_ZONE" ) {
6473 zones[active_index].get().set_enabled( true );
6474
6475 stuff_changed = true;
6476
6477 } else if( action == "DISABLE_ZONE" ) {
6478 zones[active_index].get().set_enabled( false );
6479
6480 stuff_changed = true;
6481 }
6482 }
6483
6484 if( zone_cnt > 0 ) {
6485 blink = !blink;
6486 const auto &zone = zones[active_index].get();
6487 zone_start = m.getlocal( zone.get_start_point() );
6488 zone_end = m.getlocal( zone.get_end_point() );
6489 ctxt.set_timeout( get_option<int>( "BLINK_SPEED" ) );
6490 } else {
6491 blink = false;
6492 zone_start = zone_end = cata::nullopt;
6493 ctxt.reset_timeout();
6494 }
6495
6496 // Actually accessed from the terrain overlay callback `zone_cb` in the
6497 // call to `ui_manager::redraw`.
6498 //NOLINTNEXTLINE(clang-analyzer-deadcode.DeadStores)
6499 zone_blink = blink;
6501
6503
6504 //Wait for input
6505 action = ctxt.handle_input();
6506 } while( action != "QUIT" );
6507 zones_manager_open = false;
6508 ctxt.reset_timeout();
6509 zone_cb = nullptr;
6510
6511 if( stuff_changed ) {
6512 auto &zones = zone_manager::get_manager();
6513 if( query_yn( _( "Save changes?" ) ) ) {
6514 zones.save_zones();
6515 } else {
6516 zones.load_zones();
6517 }
6518
6519 zones.cache_data();
6520 }
6521
6522 u.view_offset = stored_view_offset;
6523}
query_popup & on_top(bool top)
Whether to show the popup on the top of the screen.
Definition: popup.cpp:59
std::reference_wrapper< zone_data > ref_zone_data
Definition: clzones.h:342
static shared_ptr_fast< zone_options > create(const zone_type_id &type)
Definition: clzones.cpp:186
int trig_dist(const coords::coord_point< Point, Origin, Scale > &loc1, const coords::coord_point< Point, Origin, Scale > &loc2)
Definition: coordinates.h:512
static void zones_manager_shortcuts(const catacurses::window &w_info)
Definition: game.cpp:5998
static void zones_manager_draw_borders(const catacurses::window &w_border, const catacurses::window &w_info_border, const int iInfoHeight, const int width)
Definition: game.cpp:6021
std::string options()
Definition: path_info.cpp:238
const std::set< itype_id > & get()
void display_zones(const tripoint_abs_omt &center, const tripoint_abs_omt &select, int iZoneIndex)
Display overmap like with display() and display the given zone.
std::string trim_by_length(const std::string &text, int width)
Definition: output.cpp:224
cata::optional< tripoint > position
Definition: game.h:127

References _, action, add_draw_callback(), c_green, c_light_gray, c_light_green, c_white, c_yellow, calcStartPos(), center, zone_options::create(), create_zone_callback(), direction_from(), direction_name_short(), ui::omap::display_zones(), draw_scrollbar(), uilist::entries, g, charge_removal_blacklist::get(), zone_manager::get_manager(), map::getabs(), map::getlocal(), Character::global_omt_location(), input_context::handle_input(), invalidate_main_ui_adaptor(), look_around(), m, query_popup::message(), ms_to_omt_copy(), mvwprintz(), om_direction::name(), catacurses::newwin(), cata::nullopt, query_popup::on_top(), PATH_INFO::options(), point_south, point_zero, popup(), Character::pos(), look_around_result::position, uilist::query(), query_yn(), ui_manager::redraw(), input_context::register_action(), input_context::register_cardinal(), input_context::reset_timeout(), uilist::ret, rl_dist(), second, input_context::set_timeout(), TERMX, TERMY, uilist::text, trig_dist(), trim_by_length(), tripoint_zero, u, player::view_offset, catacurses::werase(), catacurses::wnoutrefresh(), tripoint::z, zones_manager_draw_borders(), zones_manager_open, and zones_manager_shortcuts().

Referenced by handle_action().

◆ zoom_in()

void game::zoom_in ( )

Definition at line 7025 of file game.cpp.

7026{
7027#if defined(TILES)
7028 if( tileset_zoom == 64 ) {
7029 tileset_zoom = MAXIMUM_ZOOM_LEVEL;
7030 } else {
7032 }
7033 rescale_tileset( tileset_zoom );
7034#endif
7035}

References tileset_zoom.

Referenced by handle_action(), and look_around().

◆ zoom_out()

void game::zoom_out ( )

Definition at line 7013 of file game.cpp.

7014{
7015#if defined(TILES)
7016 if( tileset_zoom > MAXIMUM_ZOOM_LEVEL ) {
7018 } else {
7019 tileset_zoom = 64;
7020 }
7021 rescale_tileset( tileset_zoom );
7022#endif
7023}

References tileset_zoom.

Referenced by handle_action(), and look_around().

Friends And Related Function Documentation

◆ advanced_inventory

friend class advanced_inventory
friend

Definition at line 146 of file game.h.

◆ Creature_range

friend class Creature_range
friend

Definition at line 334 of file game.h.

Referenced by all_creatures().

◆ editmap

friend class editmap
friend

Definition at line 145 of file game.h.

◆ get_avatar

avatar & get_avatar ( )
friend

Definition at line 104 of file avatar.cpp.

105{
106 return g->u;
107}

Referenced by butcher_submenu().

◆ get_distribution_grid_tracker

distribution_grid_tracker & get_distribution_grid_tracker ( )
friend

Returns distribution grid tracker that is a part of the global game *g.

game TODO: This wouldn't be required in an ideal world

Definition at line 12024 of file game.cpp.

12025{
12026 return *g->grid_tracker_ptr;
12027}

◆ get_map

map & get_map ( )
friend

◆ get_player_character

Character & get_player_character ( )
friend

Definition at line 393 of file character.cpp.

394{
395 return g->u;
396}

◆ get_weather

weather_manager & get_weather ( )
friend

Definition at line 64 of file weather.cpp.

65{
66 return *g->weather_manager_ptr;
67}

Referenced by do_turn(), get_player_input(), is_in_sunlight(), load(), natural_light_level(), place_player_overmap(), serialize_master(), setup(), start_game(), and unserialize_master().

◆ main_menu

friend class main_menu
friend

Definition at line 147 of file game.h.

◆ monster_range

friend class monster_range
friend

Definition at line 333 of file game.h.

Referenced by all_monsters().

Member Data Documentation

◆ achievements_tracker_ptr

pimpl<achievements_tracker> game::achievements_tracker_ptr
private

Definition at line 955 of file game.h.

Referenced by death_screen(), game(), handle_action(), serialize(), setup(), unserialize(), and win().

◆ active_npc

◆ auto_travel_mode

bool game::auto_travel_mode = false

Definition at line 1018 of file game.h.

Referenced by handle_action(), serialize(), and unserialize().

◆ bVMonsterLookFire

bool game::bVMonsterLookFire = false
private

Definition at line 1035 of file game.h.

Referenced by list_monsters(), look_around(), and setup().

◆ coming_to_stairs

std::vector<monster> game::coming_to_stairs

◆ critter_died

bool game::critter_died = false
private

Has anything died in this turn and needs to be cleaned up?

Definition at line 1049 of file game.h.

Referenced by cleanup_dead(), and set_critter_died().

◆ critter_tracker

◆ debug_hour_timer

◆ debug_pathfinding

bool game::debug_pathfinding = false

Definition at line 999 of file game.h.

◆ debug_submap_grid_overlay

bool game::debug_submap_grid_overlay = false

Definition at line 1000 of file game.h.

◆ destination_preview

std::vector<tripoint> game::destination_preview
private

◆ displaying_lighting_condition

int game::displaying_lighting_condition = 0

Type of lighting condition overlay to display.

Definition at line 1012 of file game.h.

◆ displaying_overlays

cata::optional<action_id> game::displaying_overlays
private

Definition at line 919 of file game.h.

Referenced by display_overlay_state(), and display_toggle_overlay().

◆ displaying_visibility_creature

Creature* game::displaying_visibility_creature

Creature for which to display the visibility map.

Definition at line 1010 of file game.h.

Referenced by display_visibility().

◆ draw_callbacks

std::vector<weak_ptr_fast<draw_callback_t> > game::draw_callbacks
private

Definition at line 225 of file game.h.

Referenced by add_draw_callback(), and draw().

◆ driving_view_offset

point game::driving_view_offset

Definition at line 997 of file game.h.

Referenced by calc_driving_offset(), do_turn(), handle_action(), and set_driving_view_offset().

◆ event_bus_ptr

pimpl<event_bus> game::event_bus_ptr
private

Definition at line 953 of file game.h.

Referenced by events().

◆ faction_manager_ptr

◆ first_redraw_since_waiting_started

bool game::first_redraw_since_waiting_started = true
private

Is this the first redraw since waiting (sleeping or activity) started.

Definition at line 1051 of file game.h.

Referenced by do_turn(), and game().

◆ follower_ids

std::set<character_id> game::follower_ids
private

◆ fullscreen

bool game::fullscreen = false

◆ gamemode

std::unique_ptr<special_game> game::gamemode
private

◆ grid_tracker_ptr

pimpl<distribution_grid_tracker> game::grid_tracker_ptr
private

Definition at line 959 of file game.h.

Referenced by do_turn(), load_map(), on_options_changed(), and update_map().

◆ is_looking

bool game::is_looking = false
private

Definition at line 224 of file game.h.

Referenced by draw_ter(), and look_around().

◆ kill_tracker_ptr

pimpl<kill_tracker> game::kill_tracker_ptr
private

Definition at line 956 of file game.h.

Referenced by game(), get_kill_tracker(), serialize(), setup(), and unserialize().

◆ last_mouse_edge_scroll

std::chrono::time_point<std::chrono::steady_clock> game::last_mouse_edge_scroll
private

Definition at line 1068 of file game.h.

Referenced by mouse_edge_scrolling().

◆ last_mouse_edge_scroll_vector_overmap

tripoint game::last_mouse_edge_scroll_vector_overmap
private

Definition at line 1070 of file game.h.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ last_mouse_edge_scroll_vector_terrain

tripoint game::last_mouse_edge_scroll_vector_terrain
private

Definition at line 1069 of file game.h.

Referenced by mouse_edge_scrolling_overmap(), and mouse_edge_scrolling_terrain().

◆ last_save_timestamp

time_t game::last_save_timestamp
private

Definition at line 1041 of file game.h.

Referenced by autosave(), init_autosave(), and quicksave().

◆ latest_lightlevels

std::array<float, OVERMAP_LAYERS> game::latest_lightlevels
mutableprivate

Definition at line 1042 of file game.h.

Referenced by natural_light_level(), and reset_light_level().

◆ list_item_downvote

std::string game::list_item_downvote
private

Definition at line 1032 of file game.h.

Referenced by list_items().

◆ list_item_upvote

std::string game::list_item_upvote
private

Definition at line 1031 of file game.h.

Referenced by list_items().

◆ liveview

live_view& game::liveview
private

Definition at line 950 of file game.h.

Referenced by draw_look_around_cursor(), and handle_mouseview().

◆ liveview_ptr

pimpl<live_view> game::liveview_ptr
private

Definition at line 949 of file game.h.

◆ m

map& game::m

Definition at line 963 of file game.h.

Referenced by autopilot_vehicles(), cata_event_dispatch::avatar_moves(), butcher(), catch_a_monster(), chat(), check_near_zone(), check_zone(), control_vehicle(), delete_cyborg_item(), disable_robot(), disp_NPCs(), do_turn(), draw(), draw_bullet(), draw_critter(), draw_critter_highlighted(), draw_critter_internal(), draw_hit_mon(), draw_look_around_cursor(), draw_ter(), examine(), extended_description(), find_nearby_items(), find_or_make_stairs(), fling_creature(), forced_door_closing(), get_cur_om(), get_dangerous_tile(), get_fishable_locations(), get_levx(), get_levy(), get_levz(), get_player_input(), get_veh_dir_indicator_location(), grabbed_furn_move(), grabbed_veh_move(), handle_action(), is_empty(), is_game_over(), is_in_sunlight(), is_sheltered(), knockback(), list_items(), list_monsters(), load(), load_map(), load_npcs(), look_around(), mon_info_update(), monmove(), moving_vehicle_dismount(), peek(), perhaps_add_random_npc(), phasing_move(), pickup(), place_critter_around(), place_player(), place_player_overmap(), place_vehicle_nearby(), pre_print_all_tile_info(), print_all_tile_info(), print_fields_info(), print_graffiti_info(), print_items_info(), print_terrain_info(), print_trap_info(), process_artifact(), prompt_dangerous_tile(), remoteveh(), save_maps(), serialize(), setup(), shift_monsters(), start_game(), start_hauling(), swap_critters(), try_get_left_click_action(), try_get_right_click_action(), update_map(), update_stair_monsters(), use_computer(), validate_camps(), validate_linked_vehicles(), validate_mounted_npcs(), vertical_move(), vertical_notes(), vertical_shift(), walk_move(), and zones_manager().

◆ main_ui_adaptor

weak_ptr_fast<ui_adaptor> game::main_ui_adaptor
private

◆ map_ptr

pimpl<map> game::map_ptr
private

Definition at line 947 of file game.h.

◆ memorial_logger_ptr

pimpl<memorial_logger> game::memorial_logger_ptr
private

Definition at line 957 of file game.h.

Referenced by game(), and memorial().

◆ monstairz

int game::monstairz = 0

Definition at line 984 of file game.h.

Referenced by update_stair_monsters(), and vertical_move().

◆ mostseen

int game::mostseen = 0

◆ moves_since_last_save

int game::moves_since_last_save = 0
private

Definition at line 1040 of file game.h.

Referenced by do_turn(), get_moves_since_last_save(), init_autosave(), quickload(), and quicksave().

◆ new_game

bool game::new_game = false

True if the game has just started or loaded, else false.

Definition at line 980 of file game.h.

Referenced by do_turn(), setup(), and start_game().

◆ next_mission_id

int game::next_mission_id = 0
private

Definition at line 1038 of file game.h.

Referenced by assign_mission_id(), serialize_master(), setup(), and unserialize_master().

◆ next_npc_id

character_id game::next_npc_id
private

Definition at line 1036 of file game.h.

Referenced by assign_npc_id(), serialize_master(), setup(), and unserialize_master().

◆ npcs_dirty

bool game::npcs_dirty = false
private

Has a NPC been spawned since last load?

Definition at line 1047 of file game.h.

Referenced by do_turn(), load_npcs(), and set_npcs_dirty().

◆ queue_screenshot

bool game::queue_screenshot = false

Definition at line 1019 of file game.h.

Referenced by do_turn().

◆ remoteveh_cache

vehicle* game::remoteveh_cache
private

Definition at line 1045 of file game.h.

Referenced by remoteveh(), setremoteveh(), and setup().

◆ remoteveh_cache_time

time_point game::remoteveh_cache_time
private

Definition at line 1044 of file game.h.

Referenced by remoteveh(), setremoteveh(), and setup().

◆ right_sidebar

bool game::right_sidebar = false

Definition at line 1015 of file game.h.

◆ safe_mode

◆ safe_mode_warning_logged

bool game::safe_mode_warning_logged = false
private

Definition at line 1034 of file game.h.

Referenced by check_safe_mode_allowed(), handle_action(), and set_safe_mode().

◆ scen

const scenario* game::scen

Definition at line 982 of file game.h.

Referenced by start_calendar(), and start_game().

◆ scent

scent_map& game::scent

Definition at line 965 of file game.h.

Referenced by display_scent(), do_turn(), serialize(), setup(), unserialize(), update_map(), and vertical_shift().

◆ scent_ptr

pimpl<scent_map> game::scent_ptr
private

Definition at line 951 of file game.h.

◆ seed

unsigned int game::seed = 0
private

Seed for all the random numbers that should have consistent randomness (weather).

Definition at line 1063 of file game.h.

Referenced by get_seed(), serialize_master(), start_game(), and unserialize_master().

◆ sFilter

std::string game::sFilter
private

Definition at line 1030 of file game.h.

Referenced by list_items(), and reset_item_list_state().

◆ show_panel_adm

bool game::show_panel_adm = false

Definition at line 1014 of file game.h.

Referenced by draw_panels(), and load_static_data().

◆ spell_events_ptr

pimpl<spell_events> game::spell_events_ptr
private

Definition at line 958 of file game.h.

Referenced by game(), and spell_events_subscriber().

◆ stats_tracker_ptr

pimpl<stats_tracker> game::stats_tracker_ptr
private

Definition at line 954 of file game.h.

Referenced by game(), serialize(), stats(), and unserialize().

◆ ter_view_p

tripoint game::ter_view_p

Definition at line 986 of file game.h.

Referenced by draw(), and draw_ter().

◆ tileset_zoom

int game::tileset_zoom = 0
private

How far the tileset should be zoomed out, 16 is default.

32 is zoomed in by x2, 8 is zoomed out by x0.5

Definition at line 1060 of file game.h.

Referenced by get_zoom(), look_around(), mouse_edge_scrolling_terrain(), reset_zoom(), set_zoom(), zoom_in(), and zoom_out().

◆ timed_event_manager_ptr

pimpl<timed_event_manager> game::timed_event_manager_ptr
private

Definition at line 952 of file game.h.

◆ timed_events

timed_event_manager& game::timed_events

Definition at line 966 of file game.h.

Referenced by do_turn(), natural_light_level(), and setup().

◆ token_provider_ptr

pimpl<drop_token_provider> game::token_provider_ptr

Definition at line 975 of file game.h.

Referenced by serialize(), setup(), and unserialize().

◆ turnssincelastmon

int game::turnssincelastmon = 0

Definition at line 1021 of file game.h.

Referenced by handle_action(), mon_info_update(), and setup().

◆ u

avatar& game::u

Definition at line 964 of file game.h.

Referenced by add_artifact_dreams(), add_npc_follower(), autopilot_vehicles(), cata_event_dispatch::avatar_moves(), butcher(), calc_driving_offset(), cancel_activity_or_ignore_query(), cancel_activity_query(), catch_a_monster(), centerlistview(), chat(), check_safe_mode_allowed(), cleanup_at_end(), control_vehicle(), create_starting_npcs(), critter_at(), critter_by_id(), death_screen(), disable_robot(), disp_NPCs(), display_scent(), do_turn(), draw(), draw_critter(), draw_critter_highlighted(), draw_critter_internal(), draw_hit_mon(), draw_line(), draw_look_around_cursor(), draw_minimap(), draw_panels(), draw_ter(), draw_trail_to_square(), draw_veh_dir_indicator(), drop(), drop_in_direction(), exam_vehicle(), examine(), extended_description(), find_nearby_items(), find_or_make_stairs(), fling_creature(), forced_door_closing(), fungal_effects::fungalize(), get_dangerous_tile(), get_player_base_save_path(), get_player_input(), get_veh_dir_indicator_location(), grabbed_furn_move(), grabbed_move(), grabbed_veh_move(), handle_action(), handle_key_blocking_activity(), inv_map_splice(), is_game_over(), is_hostile_within(), is_in_viewport(), item_action_menu(), knockback(), list_items(), list_items_monsters(), list_missions(), list_monsters(), load(), look_around(), mon_info(), mon_info_update(), monmove(), move_save_to_graveyard(), moving_vehicle_dismount(), npc_menu(), on_move_effects(), open_consume_item_menu(), overmap_npc_move(), peek(), perhaps_add_random_npc(), phasing_move(), pickup_feet(), place_player(), place_player_overmap(), print_all_tile_info(), print_creature_info(), print_items_info(), print_terrain_info(), print_trap_info(), process_activity(), process_artifact(), process_voluntary_act_interrupt(), prompt_dangerous_tile(), quickload(), remoteveh(), remove_npc_follower(), save(), save_player_data(), serialize(), set_driving_view_offset(), setremoteveh(), shared_from(), slip_down(), fungal_effects::spread_fungus_one_tile(), start_game(), start_hauling(), toggle_gate(), try_get_left_click_action(), try_get_right_click_action(), unserialize(), update_map(), update_overmap_seen(), update_stair_monsters(), use_computer(), validate_camps(), validate_npc_followers(), vertical_move(), vertical_notes(), vertical_shift(), walk_move(), win(), win_screen(), and zones_manager().

◆ u_ptr

pimpl<avatar> game::u_ptr
private

Definition at line 948 of file game.h.

◆ u_shared_ptr

shared_ptr_fast<player> game::u_shared_ptr
private

Definition at line 1025 of file game.h.

Referenced by shared_from().

◆ uquit

quit_status game::uquit

Used in main.cpp to determine what type of quit is being performed.

Definition at line 978 of file game.h.

Referenced by cleanup_at_end(), do_turn(), get_player_input(), handle_action(), is_game_over(), and setup().

◆ user_action_counter

int game::user_action_counter = 0
private

Definition at line 1057 of file game.h.

Referenced by get_user_action_counter(), and handle_action().

◆ w_minimap

catacurses::window game::w_minimap

Definition at line 990 of file game.h.

Referenced by create_or_get_main_ui_adaptor(), and draw_minimap().

◆ w_minimap_ptr

catacurses::window game::w_minimap_ptr
private

Definition at line 1028 of file game.h.

Referenced by create_or_get_main_ui_adaptor().

◆ w_omlegend

catacurses::window game::w_omlegend

Definition at line 989 of file game.h.

◆ w_overmap

catacurses::window game::w_overmap

Definition at line 988 of file game.h.

◆ w_pixel_minimap

catacurses::window game::w_pixel_minimap

◆ w_terrain

◆ w_terrain_ptr

catacurses::window game::w_terrain_ptr
private

Definition at line 1027 of file game.h.

Referenced by create_or_get_main_ui_adaptor().

◆ wait_popup

std::unique_ptr<static_popup> game::wait_popup
private

Definition at line 1076 of file game.h.

Referenced by do_turn().

◆ was_fullscreen

bool game::was_fullscreen = false

Definition at line 1017 of file game.h.

Referenced by load_static_data(), reenter_fullscreen(), and temp_exit_fullscreen().

◆ weather_manager_ptr

pimpl<weather_manager> game::weather_manager_ptr
private

Definition at line 960 of file game.h.

◆ zones_manager_open

bool game::zones_manager_open = false
private

Is Zone manager open or not - changes graphics of some zone tiles.

Definition at line 1053 of file game.h.

Referenced by is_zones_manager_open(), and zones_manager().


The documentation for this class was generated from the following files: